当前位置: 首页 > 面试题库 >

如何在SQL Server中选择彼此相距一个小时的记录

朱梓
2023-03-14
问题内容

我有一组带时间戳的user_id登录数据。

一个用户可以多次登录,但从最小记录开始,我们需要至少相隔一个小时返回记录。重复数据删除必须在用户级别进行(可以有多个用户)

例如

  • user1 2012-03-07 14:24:30.000
  • user1 2012-03-07 14:34:30.000
  • user1 2012-03-07 15:14:30.000
  • user1 2012-03-07 15:20:30.000
  • user1 2012-03-07 15:30:30.000
  • user1 2012-03-08 09:20:30.000
  • user1 2012-03-08 09:50:30.000
  • user1 2012-03-08 10:30:30.000
  • user2 2012-03-07 15:20:30.000

我只想查看以下记录

  • user1 2012-03-07 14:24:30.000
  • user1 2012-03-07 15:30:30.000
  • user1 2012-03-08 09:20:30.000
  • user1 2012-03-08 10:30:30.000
  • user2 2012-03-07 15:20:30.000

================================================== ======================

有什么办法可以做到这一点吗?我们可以递归地执行此操作,但我希望可能有一种使用row_number分区的方式。

任何帮助深表感谢!!


问题答案:

在Sql Server 2005或更高版本中,此CTE将返回LoginAt datetimes表,将其与已选择的LoginAts相隔不到一小时的表删除。

;with SkipHour(UserID, LoginAT, rn) as (
  select UserID, min(LoginAt), cast (1 as bigint)
    from LogTable
   group by UserID
  union all
  select SkipHour.UserID, LogTable.LoginAt,
         row_number() over (partition by SkipHour.UserID 
                            order by Logtable.LoginAt) rn
  from SkipHour
     inner join LogTable
        on LogTable.UserID = SkipHour.UserID
     where datediff(minute, SkipHour.LoginAt, LogTable.LoginAt) >= 60
     -- Only first rows from previous generation qualify to have children
        and rn = 1
)
select *
from SkipHour
where rn = 1
order by UserID, LoginAT

关键部分是row_number()。由于Sql Server既不允许聚合函数也不允许顶级谓词,因此row_number()是订购loginAt
datetimes并仅保留第一个的唯一方法(IMO)。

Sql Fiddle游乐场就是这种方式。

更新

行号分别适用于每一代。从WITH common_table_expression(Transact-
SQL)中
提取:

CTE递归部分中的html" target="_blank">分析函数和集合函数将应用于当前递归级别的集合,而不应用于CTE的集合。像ROW_NUMBER之类的函数仅对当前递归级别传递给它们的数据子集起作用,而不对粘贴到CTE递归部分的整个数据集起作用。有关更多信息,请参见J.在递归CTE中使用分析函数。



 类似资料:
  • 一个网站的问题:实现一个Java函数,在一个数组中找到两个彼此距离最小的数字。函数应该返回第一个数字的索引。 null

  • 问题内容: 是否有类似于“不等于”的方法? 我要完成的示例如下: 我试图找到不需要我使用的东西。 问题答案: 只需输入一个“!” 在布尔表达式前面

  • 问题内容: 我希望两个div在包装div中彼此相邻。在这种情况下,绿色div的高度应确定包装纸的高度。 我如何通过CSS实现呢? 问题答案: 浮动一个或两个内部div。 浮动一格: 或者如果您同时浮动两个子元素,则需要鼓励包装器div包含两个浮动子元素,否则它会认为它是空的而不是在它们周围放置边框 浮动两个div:

  • 问题内容: 我要两个紧挨着。右边大约200px;并且左侧必须填满屏幕的其余宽度?我怎样才能做到这一点? 问题答案: 您可以使用 flexbox 布置物品: 这基本上只是刮擦flexbox的表面。Flexbox可以做很多令人惊奇的事情。 对于较旧的浏览器支持,可以使用CSS float 和 width 属性来解决它。

  • 给出一个2d点的列表和一个最大距离d,比O(n^2更好的方法是什么)找出哪些点位于每个点的d以内。我不需要解决方案,只需要一些开始的想法。

  • 在我工作的项目中,有一个包含以下字段的数据库表: 从数据库表中,我想显示在病房中可用的床,但当病房被选中时没有被占用,那么在床选择标签中应该只显示可用的床。 jsp表单select标记代码为: 所以问题是我如何才能做到这一点? 我是新Java发展,这是我的第一个项目,所以请原谅,如果任何愚蠢的错误发现。 谢谢你的帮助,非常感谢。