Sql 查找“的行”;“重复”;具有最大价值的数据

Sql 查找“的行”;“重复”;具有最大价值的数据,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我的表格设置如下: Key || Code || Date 5 2 2018 5 1 2017 8 1 2018 8 2 2017 我只需要检索密钥和代码,其中: Code=2 AND Date > the other record's date 因此,基于上述数据,我需要检索: Key 5 with code=2 键8不符合标准,因为代码2的日期低于代码1的日期 我尝试在表本身上加入,但返回的数

我的表格设置如下:

Key || Code || Date
5       2      2018
5       1      2017
8       1      2018
8       2      2017
我只需要检索密钥和代码,其中:

Code=2 AND Date > the other record's date
因此,基于上述数据,我需要检索:

Key 5 with code=2
键8不符合标准,因为代码2的日期低于代码1的日期

我尝试在表本身上加入,但返回的数据不正确

Select key,code 
from data d1
Join data d2 on d1.key = d2.key
Where d1.code = 2 and d1.date > d2.date
此方法返回的数据值不正确,数据错误

也许你想要这个:

select d.*
from data d
where d.code = 2 and
      d.date > (select d2.date
                from data d2
                where d2.key = d.key and d2.code = 1
               );
如果您只需要密钥,我会选择聚合:

select d.key
from data d
group by d.key
having max(case when d2.code = 2 then date end) > max(case when d2.code <> 2 then date end);
选择d键
从数据d
按d键分组
最大值(当d2.code=2时,则日期结束)>最大值(当d2.code=2时,则日期结束);

使用
行数
,您可以按升序选择带有日期的行。这基于示例数据,选择2行

DECLARE @table TABLE ([key] INT, code INT, DATE INT)

INSERT @table
SELECT 5, 2, 2018

UNION ALL

SELECT 5, 2, 2018

UNION ALL

SELECT 8, 1, 2018

UNION ALL

SELECT 8, 2, 2017

SELECT [key], code, DATE
FROM (
    SELECT [key], code, DATE, ROW_NUMBER() OVER (
            PARTITION BY [key], code ORDER BY DATE
            ) rn
    FROM @table
    ) x
WHERE rn = 2

这可能就是答案,idk为什么我没有想到这一点。如果有效,将测试并标记为答案。谢谢。真不敢相信我以前从未见过这种语法+1可能的副本