2015-04-06 61 views
0

DENSE_RANK最後爲了我與甲骨文SQL服務器:通過保持

select 
     max(DW_EXTRACT_DATE)    as DW_EXTRACT_DATE, 
     DW_LOGICAL_DATE  as SELECTION_DATE, 
     max(DW_LOGICAL_DATE)    as DW_LOGICAL_DATE, 
     max(RUNTIME_AUDIT_ID)    as RUNTIME_AUDIT_ID, 
     max(REC_SRC_SYS)    as REC_SRC_SYS, 
     POSITION_ID, 
     EMPLOYEE_ID, 
      PRIMARY_POS, 
      INV_STR_DATE, 
      max(POS_STOP_DATE) keep (dense_rank last order by INV_STR_DATE)  as POSITION_STOP_DATE, 
      max(CHANGE_REASON) keep (dense_rank last order by INV_STR_DATE)  as CHANGE_REASON_CD, 
      max(ACTUAL_FTE_PERC) keep (dense_rank last order by INV_STR_DATE) as ACTUAL_FTE_PERC 
     from 
     EMPLOYEE_POSITION 
     where 
     POSITION_ID  != 'TERMINATED' 
     group by 
     DW_LOGICAL_DATE, 
     POSITION_ID, 
     EMPLOYEE_ID, 
     PRIMARY_POS, 
     INV_STR_DATE 

下面的查詢如何做與SQL Server一樣的嗎?我是一個與甲骨文新的。

我試過以下查詢。

SELECT DW_EXTRACT_DATE,DW_LOGICAL_DATE,RUNTIME_AUDIT_ID,REC_SRC_SYS,REC_SRC_SYS,POSITION_ID, 

     EMPLOYEE_ID, PRIMARY_POS,INV_STR_DATE,POS_STOP_DATE, 
      CHANGE_REASON, 
      ACTUAL_FTE_PERC 
FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY POS_STOP_DATE ORDER BY INV_STR_DATE DESC) Corr 
     FROM EMPLOYEE_POSITION 
     where POSITION_ID  != 'TERMINATED') A WHERE Corr = 1 

回答

3

在SQL Server 2012+,你可以使用FIRST_VALUE()

所以(讓事情變得簡單):

SELECT max(POS_STOP_DATE) keep (dense_rank last order by INV_STR_DATE) as POSITION_STOP_DATE 
FROM EMPLOYEE_POSITION 
GROUP BY X; 

可以寫在SQL Server的2012+爲:

SELECT MAX(POSITION_STOP_DATE) 
FROM (SELECT ep.*, 
      FIRST_VALUE(POS_STOP_DATE) OVER (PARTITION BY X ORDER BY INV_STR_DATE DESC) as POSITION_STOP_DATE 
     FROM EMPLOYEE_POSITION ep 
    ) ep 
GROUP BY x; 

在SQL Server 2005+中,您可以使用ROW_NUMBER()和條件聚合來完成此操作:

SELECT MAX(CASE WHEN seqnum = 1 THEN POS_STOP_DATE END) as POSITION_STOP_DATE) 
FROM (SELECT ep.*, 
      ROW_NUMBER() OVER (PARTITION BY X ORDER BY INV_STR_DATE DESC) as seqnum 
     FROM EMPLOYEE_POSITION ep 
    ) ep 
GROUP BY x; 
+0

我在查詢中有三次eep-dense,如何添加它們全部?我應該用什麼來取代X? – 2015-04-06 11:07:35

+0

使用子查詢並在子查詢中放入'first_value()'。他們都在做同樣的事情,所以如果你走這條路,你可以使用一個'row_number()'。 – 2015-04-06 11:32:32