簡體   English   中英

SQL查詢以獲取第一個日期,具體取決於當前組(〜控制中斷)

[英]SQL query to get the first date, depending on the current group (~control break)

我正在嘗試創建一個SQL查詢,該查詢返回當前組的第一個日期。

讓我們假設(僅作為示例)每個月的第一天在表(EmployeeInfo)中保存一行,其中包含員工ID和當前部門。

EmployeeID, Department, Date (Format: DD.MM.YYYY)
100, IT, 01.07.2014
100, IT, 01.08.2014
100, IT, 01.09.2014
100, HR, 01.10.2014
100, HR, 01.11.2014
100, CC, 01.12.2014
100, IT, 01.01.2015
100, IT, 01.02.2015
100, IT, 01.03.2015
100, IT, 01.04.2015

由於員工在當前部門工作,因此查詢應返回日期。

ID為100的員工當前部門為IT,因此該值應為01.01.2015(而不是01.07.2014)。

任何想法如何實現?

更新基於OP的評論的新答案。

您可以使用ANALYTIC函數ROW_NUMBERLAG 。類似於group方法的開始:

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>

使用以下查詢,讓我知道是否需要這個

   WITH table_ (EmployeeID, Department, Dat) AS (
      SELECT 100, 'IT', TO_DATE('01.07.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'IT', TO_DATE('01.08.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'IT', TO_DATE('01.09.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'HR', TO_DATE('01.10.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'HR', TO_DATE('01.11.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'CC', TO_DATE('01.12.2014', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'IT', TO_DATE('01.01.2015', 'DD.MM.YYYY') FROM DUAL UNION ALL
      SELECT 100, 'IT', TO_DATE('01.02.2015', 'DD.MM.YYYY') FROM DUAL),
    ----------
    --End of Data preparation
    ----------
    table1 AS (SELECT EmployeeID, Department, Dat, 
                      row_number() OVER (PARTITION BY EmployeeID ORDER BY dat DESC) -
                      row_number() OVER (PARTITION BY EmployeeID, department ORDER BY dat DESC) rk
                 FROM TABLE_),
    table2 AS (SELECT EmployeeID, Department, Dat, RANK() OVER (PARTITION BY employeeid ORDER BY dat) rnk
                 from table1
                WHERE rk = 0 )
    SELECT EmployeeID, Department, Dat
      FROM table2
     WHERE rnk = 1;

輸出:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM