【问题标题】:How to select the top 3 values from a group based on date and exclude duplicate value?如何根据日期从组中选择前 3 个值并排除重复值?
【发布时间】:2019-05-28 20:26:33
【问题描述】:

如果我是三列,1 列有 ID,1 列有值,1 列有日期。例如,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

【问题讨论】:

  • 你可以使用聚合函数,sum,avg..你想用它做什么?
  • 你的意思是你不知道如何使用row_number() 或者你的数据库没有它?你的数据库是什么版本的?

标签: sql sybase


【解决方案1】:

如果你没有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 个或更多旧行,则不会出现。

带有row_number

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() 并决定如何处理关系。

【讨论】:

    【解决方案2】:

    一种方法使用带有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
                    );
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2019-08-04
      • 1970-01-01
      • 2022-01-04
      • 2018-03-30
      相关资源
      最近更新 更多