如何根据日期从组中选择前三个值并排除重复值?

时间:2019-05-28 20:26:34

标签: sql sybase

如果我的三列和一列具有ID,则一列具有值,一列具有日期。例如,ID列具有ID1,ID2,ID3。每个ID的值都有一个数字值,例如每个ID分别为1,2,3,4,5。
如何根据最新的日期降序为每个ID仅获得3个结果。 我正在使用Sybase SQL。有什么办法可以写吗?

我尝试使用Row_number()和rank(),但是我的SQL工具中没有使用这两个函数。

ID  value   Date
1   3   20190511
1   1   20190503
1   5   20190401
2   2   20190520
2   1   20190514
2   4   20190503
3   1   20190516
3   5   20190415
3   3   20190402

2 个答案:

答案 0 :(得分:0)

如果您没有row_number,请尝试

SELECT * 
FROM yourTable t1
WHERE (SELECT COUNT(*) 
       FROM yourTable t2
       WHERE t1.id = t2.id
         AND t1.date < t2.date) < 3

因此,如果一个ID具有3个或更多个旧行,则不会出现。

具有行号

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) as rn
      FROM YourTable t1
     ) as t
WHERE t.rn <= 3

我假设您在同一日期不能有多行。在这种情况下,您可能需要使用RANK()DENSE_RANK()并决定如何处理领带。

答案 1 :(得分:0)

一种方法使用带有in的相关子查询:

select t.*
from t
where t.date in (select top (3) t2.date
                 from t t2
                 where t2.id = t.id
                 order by t2.date desc
                );

请注意,这是假设日期是唯一的。