首页 > 解决方案 > 使用 SQL 中的 Group 从表中获取最近的第 n 组数据

问题描述

我有一张这样的桌子

在此处输入图像描述

在这里,您可以看到不同日期的不同数据组。(当我们忽略 datetime 中的时间部分时,我们有一组日期)

所以我需要的是从每个组中获取最新的结果,并从该结果中获取最近的第 n 组。

例如,如果我通过 2,它应该返回

LogId     etime
--------------------
19         2021-07-16
--------------------------

同样,如果我们传递参数 3 它应该返回

LogId     etime
--------------------
18         2021-07-15
--------------------------

我做了一些查询,我真的认为这不是最好的方法,而且看起来有点曲折..

create table MYTABLE(logid int,etime datetime)
insert into MYTABLE (logid,etime) values
(15,'2021-07-12 01:32:00 PM'),
(16,'2021-07-15 01:32:00 PM'),
(17,'2021-07-15 04:32:00 PM'),
(18,'2021-07-15 07:32:00 PM'),
(19,'2021-07-16 11:32:00 AM'),
(20,'2021-07-16 08:10:00 AM'),
(21,'2021-07-17 11:20:00 PM')

select logid,etime from (
select *,ROW_NUMBER() over (order by etime desc) serial from (
select logid,dense_rank() over(partition by cast(etime as date) order by etime desc) drnk,Cast(etime as date) etime from @table
)tbl where drnk=1 )tbl2 where serial=3

你能分享一些最佳方法吗

这是小提琴 SQLFiddle

标签: sql-server

解决方案


似乎在OFFSET这里FETCH会更简洁:

DECLARE @N int = 2,
        @Date date = '20210716';

SELECT LogID, etime
FROM dbo.MYTABLE
WHERE etime >= @Date
  AND eTime < DATEADD(DAY, 1, @Date)
ORDER BY etime ASC
OFFSET @N-1 ROWS FETCH NEXT 1 ROWS ONLY;

推荐阅读