我有下表-
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;