SQL Server仅选择最新记录

时间:2014-01-22 04:17:19

标签: sql-server group-by

我有一张桌子看起来像这样:

表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语句使表格如上所示。

请让我知道最好的方法是什么......我在网上搜索没有任何帮助。

1 个答案:

答案 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

SQL Fiddle Demo

相关问题