选择顶部2个不同的每个ID和日期

问题描述:

我有这样的一个表:选择顶部2个不同的每个ID和日期

表1:

[Id]  [TDate]  [Score] 
    1   1.1.00  50 
    1   1.1.00  60 
    2   1.1.01  50 
    2   1.1.01  70 
    2   1.3.01  40 
    3   1.1.00  80 
    3   1.1.00  30 
    3   1.2.00  40 

我的期望输出应该是这样的:

[ID] [TDate] [Score] 
1   1.1.00  60 
2   1.1.01  70 
2   1.3.01  40 
3   1.1.00  80 
3   1.2.00  40 

所以票价,我写了这个:

SELECT DISTINCT TOP 2 Id, TDate, Score 
FROM 
( SELECT Id, TDate, Score, ROW_NUMBER() over(partition by TDate order by Score) Od 
    FROM Table1 
) A 
WHERE A.Od = 1 
ORDER BY Score 

但它g艾夫斯我:

[ID] [TDate] [Score] 
2   1.1.01  70 
3   1.1.00  80 

我当然可以这样做:

"select top 2 ...where ID = 1" 

然后:

union 
`"Select top 2 ... where ID = 2"` 

等。 但我有这10万..

任何方式将其推广到任何身份证? 谢谢。

+1

我不明白输出。为什么不是两行id = 1? –

+0

我想他想要每个ID和TDate组合的最大(分数) – GuidoG

你的输出没有意义。让我假设你想每个ID两行。那么查询将如下所示:

SELECT TOP 2 Id, TDate, Score 
FROM (SELECT Id, TDate, Score, 
      ROW_NUMBER() over (partition by id order by Score DESC) as seqnum 
     FROM Table1 
    ) t 
WHERE seqnum <= 2 
ORDER BY Score; 

注:

  • 这是假设你想每id两行。因此,idPARTITION BY中。
  • WHERE现在选择每组两行中PARTITION BY
  • 有外部查询不需要SELECT DISTINCT - 至少对于这个问题。

WITH TOPTWO AS (
    SELECT Id, TDate, Score, ROW_NUMBER() 
    over (
     PARTITION BY TDate 
     order by SCORE 
    ) AS RowNo 
    FROM [table_name] 
) 
SELECT * FROM TOPTWO WHERE RowNo <= 2 

除非我失去了一些东西这可以用一个简单的组由

首先要做我准备一个临时表来进行测试:

declare @table table (ID int, TDate varchar(10), Score int) 
insert into @Table values(1, '1.1.00', 50) 
insert into @Table values(1, '1.1.00', 60) 
insert into @Table values(2, '1.1.01', 50) 
insert into @Table values(2, '1.1.01', 70) 
insert into @Table values(2, '1.3.01', 40) 
insert into @Table values(3, '1.1.00', 80) 
insert into @Table values(3, '1.1.00', 30) 
insert into @Table values(3, '1.2.00', 40) 

现在,让我们做一个选择在这表

select ID, TDate, max(Score) as Score 
from @table 
group by ID, TDate 
order by ID, TDate 

结果是这样的:

ID TDate Score 
1 1.1.00 60 
2 1.1.01 70 
2 1.3.01 40 
3 1.1.00 80 
3 1.2.00 40 

因此,所有你需要做的是改变@table你的表名和你做

试试这个:通过ID和TDate使分区和排序分数降序排列

ROW_NUMBER() over(partition by ID,TDate order by Score DESC) Od 

完整脚本

WITH CTE AS(

    SELECT *, 
      ROW_NUMBER() over(partition by ID,TDate order by Score DESC) RN 
    FROM TableName 
) 
SELECT * 
FROM CTE 
WHERE RN = 1