我有一张桌子看起来像这样:
表1
ID Date TermDate Cancel
1 20140101 99999999 20140102
1 20140101 20130102 20140102
2 20140108 20130102 20140102
2 20140101 99999999 20140102
3 20140101 99999999 20140102
3 20140101 99999999 20140102
3 20140101 99999999 20140709
我想要做的是,按每个ID分组并仅选择最近的记录。 首先,我需要检查Date列,如果记录更新,那么我不需要检查其他列,在这种情况下,它是ID#2。
如果相同ID的Date列相同,那么我想比较Cancel列,无论哪个是最新的,然后该记录应该只显示,在这种情况下它是ID 3。
如果Date和Cancel列都相同,那么我需要比较TermDate列并显示最新的列,在这种情况下它是ID#1。所有列都是int类型。
基本上结果应该是:
ID Date TermDate Cancel
1 20140101 99999999 20140102
2 20140108 20130102 20140102
3 20140101 99999999 20140709
我不是自我联接表最好的人,真的不知道怎么开始这个...我现在做的是:我把表复制到Excel文件,然后手动完成工作...... 我想使用CASE语句,但实际上不知道如何将我的逻辑转换为SQL正确的代码,这是我的pseducode:
SELECT (CASE WHEN Date > DATE THEN SELECT the greater Date
CASE WHEN Date = Date THEN SELECT the grater Cancel
ELSE WHEN Date = Date AND Cancel = Cancel THEN SELECT the grater TermDate END)
FROM Table1
GROUP BY ID
我甚至不知道如何使用case语句使表格如上所示。
请让我知道最好的方法是什么......我在网上搜索没有任何帮助。
答案 0 :(得分:3)
您可以使用dense_rank
函数根据您的订单为一个ID中的每一行分配排名,并获取每个ID的第一行:
select id, [date], termdate, cancel from
(select id, [date], termdate, cancel,
dense_rank() over (partition by id order by [date] desc, cancel desc, termdate desc) rank
from table1) X
where rank = 1