Sql 根据部门选择具有最大日期的不同id

Sql 根据部门选择具有最大日期的不同id,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有一张这样的桌子 RevNo | RevContent | PIC | Created ------------------------------------------------------- 00 | Testing Purpose | Smith | 2008-01-11 01 | Testing Purpose | Windsor | 2008-02-01 02 | Test | Tho

我有一张这样的桌子

RevNo | RevContent | PIC | Created ------------------------------------------------------- 00 | Testing Purpose | Smith | 2008-01-11 01 | Testing Purpose | Windsor | 2008-02-01 02 | Test | Thorn | 2008-01-05 02 | Testing | Baker | 2008-03-01 03 | Testing only | Sykes | 2008-01-20
您的子查询组由每个部门创建(CCSMASTERLISTREVNO),但HAVING子句是错误的。相反,您应该在子句中的
中使用复合列。大概是这样的:

SELECT CCSMASTERLISTREVNO
       , CCSREVCONTENT
       , CCSPREPAREDREV
       , CCSREVEFFECTIVEDATE
FROM CCS2_TBL_MASTERLIST a 
WHERE CCSEQUIPMENTDPMT = :DPMT 
AND (CCSMASTERLISTREVNO, CCSREVEFFECTIVEDATE) in 
 (
     SELECT CCSMASTERLISTREVNO, MAX(CCSREVEFFECTIVEDATE) 
     FROM CCS2_TBL_MASTERLIST 
     GROUP BY CCSMASTERLISTREVNO )
  ) 
ORDER BY CCSMASTERLISTREVNO DESC 

一个选项是使用
行号()

另一种方法是使用
LAST
aggregate函数

SELECT RevNo
    ,MAX(RevContent) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as RevContent
    ,MAX(PIC) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as PIC
    ,MAX(Created) as CREATED
FROM t
GROUP BY RevNo;

我不太明白你的问题,但也许这能帮你

SELECT RevNo, RevContent, PIC, MAX(Created) as Created
FROM your_table_name 
GROUP BY RevNo
ORDER BY Created DESC
选择创建时的RevNo、RevContent、PIC、MAX(已创建)
从您的\u表\u名称
按RevNo分组
按创建的描述下单

我认为您需要首先按照RevNo对条目进行分组,然后根据每组最后创建的条目进行排序。

为什么测试目的| Windsor | 2008-02-01,RevNo 00。。你想要的结果是什么?revno 00不是最新的日期相关版本。@KaushikNayak,我刚刚检查了编辑历史,看起来我没有更改数据,只是更改了格式。@jmchilney:好的,那么看来N.I.A:您应该编辑预期的o/p来回答scaisEdge的问题。这是对
分组依据的无效使用。
SELECT CCSMASTERLISTREVNO
       , CCSREVCONTENT
       , CCSPREPAREDREV
       , CCSREVEFFECTIVEDATE
FROM CCS2_TBL_MASTERLIST a 
WHERE CCSEQUIPMENTDPMT = :DPMT 
AND (CCSMASTERLISTREVNO, CCSREVEFFECTIVEDATE) in 
 (
     SELECT CCSMASTERLISTREVNO, MAX(CCSREVEFFECTIVEDATE) 
     FROM CCS2_TBL_MASTERLIST 
     GROUP BY CCSMASTERLISTREVNO )
  ) 
ORDER BY CCSMASTERLISTREVNO DESC 
SELECT RevNo
    ,RevContent
    ,PIC
    ,Created
FROM (
    SELECT t.*
        ,row_number() OVER (
            PARTITION BY RevNo ORDER BY Created DESC
            ) AS rn
    FROM t
    )
WHERE rn = 1;
SELECT RevNo
    ,MAX(RevContent) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as RevContent
    ,MAX(PIC) KEEP ( DENSE_RANK LAST ORDER BY CREATED ) as PIC
    ,MAX(Created) as CREATED
FROM t
GROUP BY RevNo;
SELECT RevNo, RevContent, PIC, MAX(Created) as Created
FROM your_table_name 
GROUP BY RevNo
ORDER BY Created DESC