如何 select 最近 4 个日期
How to select latest 4 dates
我正在尝试为每个人编写查询 select 最近 4 个日期 table。我知道我可以使用 max(date) 来 select 最近的日期,但是如何 select 最后 4 个日期从每个人的最近日期开始。
我尝试的是(如下所示)但这只给我最近的事件日期。
select user, max(date)
from users
group by user
我希望看到的结果是:
用户 |日期
约翰 | 2017 年 3 月 30 日
约翰 | 2017 年 3 月 27 日
约翰 | 21/02/2017
约翰 | 2017 年 4 月 1 日
安迪 | 29/03/2017
安迪 | 2017 年 2 月 27 日
安迪 | 21/02/2017
安迪 | 2017 年 1 月 1 日
在黑暗中拍摄:
select t.person, o.date
from table t
outer apply (
select top 4 t2.date
from table2 t2
where t.personID = t2.personID
Order by t2.date desc
) o
您可以使用 ROW_NUMBER 函数:
WITH cte
AS
(
SELECT user, date, ROW_NUMBER () OVER (PARTITION BY user ORDER BY date DESC) row
FROM users
)
SELECT user, date
FROM cte
WHERE row <= 4
但是如果用户可以有重复的日期,你最好使用 DENSE_RANK 并在 SELECT 之后添加一个 DISTINCT:
DENSE_RANK () OVER (PARTITION BY user ORDER BY date DESC) row
我正在尝试为每个人编写查询 select 最近 4 个日期 table。我知道我可以使用 max(date) 来 select 最近的日期,但是如何 select 最后 4 个日期从每个人的最近日期开始。
我尝试的是(如下所示)但这只给我最近的事件日期。
select user, max(date)
from users
group by user
我希望看到的结果是:
用户 |日期
约翰 | 2017 年 3 月 30 日
约翰 | 2017 年 3 月 27 日
约翰 | 21/02/2017
约翰 | 2017 年 4 月 1 日
安迪 | 29/03/2017
安迪 | 2017 年 2 月 27 日
安迪 | 21/02/2017
安迪 | 2017 年 1 月 1 日
在黑暗中拍摄:
select t.person, o.date
from table t
outer apply (
select top 4 t2.date
from table2 t2
where t.personID = t2.personID
Order by t2.date desc
) o
您可以使用 ROW_NUMBER 函数:
WITH cte
AS
(
SELECT user, date, ROW_NUMBER () OVER (PARTITION BY user ORDER BY date DESC) row
FROM users
)
SELECT user, date
FROM cte
WHERE row <= 4
但是如果用户可以有重复的日期,你最好使用 DENSE_RANK 并在 SELECT 之后添加一个 DISTINCT:
DENSE_RANK () OVER (PARTITION BY user ORDER BY date DESC) row