2015-04-06 111 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