我有下表-

ID | Type | Val0 | Val1 | Group | Creation_date
1  |  A   |  V1  | Val1 | G1    | 24sep, 2011
2  |  A   |  V1  | Val2 | G1    | 27oct, 2008
3  |  A   |  V2  | Val3 | G2    | 19oct, 2003
4  |  B   |  X1  | Xal1 | G3    | 15 dec, 2001
5  |  B   |  X2  | Xal2 | G4    | 15 dec, 2000
6  |  B   |  X2  | Xal3 | G4    | 15 dec, 1990
7  |  C   |  X3  | Xal4 | G5    | 23Dec, 2001


我只想保留特定类型的最新值,并提取旧的但不属于与最新项目相关联的组的值。因此,对于上表,我希望将这些项目提取出来-Val3,Xal2,Xal3,可以稍后将其删除。

由于A具有作为组G1的Val1的最新值,所以B具有作为Xal1的最新值,并且C具有作为Xal4的最新值。

有人可以建议我如何使用SQL做到这一点吗?

最佳答案

您可以使用row_number()。无需聚合:

select t.*
from (select t.*,
             row_number() over (partition by t.type order by creation_date desc) as seqnum
      from t
     ) t
where seqnum = 1;


但是,您需要不在该组中的值。也就是说,您希望来自val1的值(其中seqnum不是1)。这将是:

select t.val1
from (select t.*, min(seqnum) over (partition by t.type, t.group) as min_seqnum -- DON'T USE group FOR COLUMN NAMES!
      from (select t.*,
                   row_number() over (partition by t.type order by creation_date desc) as seqnum
            from t
           ) t
     ) t
where min_seqnum <> 1;

10-06 14:38