【问题标题】:SQL Server: Getting all rows 10 minutes from each otherSQL Server:让所有行彼此相隔 10 分钟
【发布时间】:2017-12-02 14:02:02
【问题描述】:

您好,我有一个无法解决的 SQL 问题。我不确定这是否是一个可以在常规的基于集合的操作中解决的问题。

这里是:

我有一个表格,其中每一行都是文档的视图。我需要找到行之间的日期彼此相差 10 分钟的行。想象一个人在 10 分钟内访问文档 13 次(在 10 秒内访问 10 次),我需要找到这些行和执行此操作的人。

换句话说,我在 Y(分钟/秒)中捕获了访问超过 X 个文档的人,向我显示该人访问的文档。

最好不要汇总数据,而只保留一个计算 ROW_NUMBER() OVER 或 Count(*) OVER 之类的数据。

这是一个例子:

【问题讨论】:

标签: sql sql-server performance


【解决方案1】:

SQL Server 中最简单的方法可能是使用带有适当参数的lead()

select t.*
from (select t.*,
             lead(happened, 12) over (partition by userkey, document order b happened) as next_happened_12
      from t
     ) t
where next_happened_12 < dateadd(minute, 10, happened);

参数是 - 1。

这不会在 10 分钟内获取所有行。这将需要自我加入,并且可能非常昂贵。 lead() 应该更有效率,并且可以利用 (userkey, document, happened) 上的索引。

【讨论】:

  • 嗨,戈登。谢谢!。但这对我没有帮助,我需要所有的行。如果它需要自我加入,那就这样吧。一个用户可以在 10 分钟内访问多个文档,上述分区不支持。我可以从分区中删除“文档”列并获得所需的结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2021-05-19
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2023-01-18
相关资源
最近更新 更多