Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL заявка за получаване на първата дата, в зависимост от текущата група (~ прекъсване на контрола)

АКТУАЛИЗАЦИЯ Нов отговор въз основа на коментарите на OP.

Можете да използвате ANALYTIC функция ROW_NUMBER и LAG .Нещо като начало на групов метод:

SQL> WITH DATA AS(
  2  SELECT 100 EmployeeID, 'IT' Department, to_date('01.07.2014','DD.MM.YYYY') dt FROM dual UNION ALL
  3  SELECT 100, 'IT', to_date('01.08.2014','DD.MM.YYYY') dt from dual union all
  4  select 100, 'IT', to_date('01.09.2014','DD.MM.YYYY') dt from dual union all
  5  SELECT 100, 'HR', to_date('01.10.2014','DD.MM.YYYY') dt from dual union all
  6  select 100, 'HR', to_date('01.11.2014','DD.MM.YYYY') dt from dual union all
  7  SELECT 100, 'CC', to_date('01.12.2014','DD.MM.YYYY') dt from dual union all
  8  select 100, 'IT', to_date('01.01.2015','DD.MM.YYYY') dt from dual union all
  9  select 100, 'IT', to_date('01.02.2015','DD.MM.YYYY') dt from dual
 10  )
 11  SELECT EmployeeID,
 12    Department,
 13    DT
 14  FROM
 15    (SELECT *
 16    FROM
 17      (SELECT t.*,
 18        CASE
 19          WHEN Department = lag(Department) over (PARTITION BY EmployeeID ORDER BY dt)
 20          THEN 0
 21          ELSE 1
 22        END gap
 23      FROM DATA t
 24      ) T
 25    WHERE GAP = 1
 26    ORDER BY DT DESC
 27    )
 28  WHERE ROWNUM = 1
 29  /

EMPLOYEEID DE DT
---------- -- ---------
       100 IT 01-JAN-15

SQL>

СТАР отговор

Например,

SQL> WITH DATA AS(
  2  SELECT 100 EmployeeID, 'IT' Department, to_date('01.07.2014','DD.MM.YYYY') dt FROM dual UNION ALL
  3  SELECT 100, 'IT', to_date('01.08.2014','DD.MM.YYYY') dt from dual union all
  4  select 100, 'IT', to_date('01.09.2014','DD.MM.YYYY') dt from dual union all
  5  SELECT 100, 'HR', to_date('01.10.2014','DD.MM.YYYY') dt from dual union all
  6  select 100, 'HR', to_date('01.11.2014','DD.MM.YYYY') dt from dual union all
  7  SELECT 100, 'CC', to_date('01.12.2014','DD.MM.YYYY') dt from dual union all
  8  select 100, 'IT', to_date('01.01.2015','DD.MM.YYYY') dt from dual union all
  9  select 100, 'IT', to_date('01.02.2015','DD.MM.YYYY') dt from dual
 10  )
 11  SELECT*
 12  FROM
 13    (SELECT t.*,
 14      row_number() OVER(PARTITION BY department ORDER BY dt DESC) rn
 15    FROM DATA t
 16    )
 17  WHERE rn = 1
 18  /

EMPLOYEEID DE DT                RN
---------- -- --------- ----------
       100 CC 01-DEC-14          1
       100 HR 01-NOV-14          1
       100 IT 01-FEB-15          1

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:ORA-01005:дадена е нулева парола; влизането е отказано

  2. Oracle sql обобщена таблица на заявки

  3. Достъп до URL параметри в Oracle Forms / OC4J

  4. Как да изберете само 1 ред от oracle sql?

  5. Попълване на нулеви стойности с последната ненулева сума - Oracle SQL