sql-server - 使用 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
解决方案
似乎在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;
推荐阅读
- python - ManyToMany 字段在单元测试中返回 None
- docker-compose - ddev start - 无法加载任何 docker-compose.*y*l 文件
- firebase - 反应原生 | Firebase Firestore | 仅在按两次后存储用户数据
- c - pthread_join 不起作用,互斥锁在 C 中不起作用
- c# - DocFX - 无法从 API 文档中过滤掉公共方法
- javascript - 获取嵌套对象的所有唯一组合
- r - 查找给定短语附近的所有术语
- python - 使用字典来引用函数内的全局变量(Python)
- apache - 在 Nginx 反向代理后面的 Apache 中获取真正的访客 IP 不起作用
- arrays - 是否有 Python 替代 IDL 的 array_indices() 函数?