【问题标题】:Filtering rows with DateTime values that are within 1 minute过滤 DateTime 值在 1 分钟内的行
【发布时间】:2010-08-19 01:46:25
【问题描述】:

我有一个包含两列的简单表“登录”:

  1. 用户名 (nvarchar)
  2. 记录(日期时间)

真的很简单,只要记录有人登录我的网络应用程序时的用户名和日期时间。然而,有时人们在一分钟内登录几次......我想尝试运行一个查询来过滤这些结果,并且即使在同一分钟内有多个登录,它也只返回一行。

这是一个例子:

(我通过简单的选择得到的结果)

username  logged
-------------------
kh0013    2010-08-16 21:29:21.020
tmt0006   2010-08-16 21:24:16.030
jrc0014   2010-08-16 21:17:37.187
jrc0014   2010-08-16 21:17:15.043
jrc0014   2010-08-16 21:17:00.593
jrm0017   2010-08-16 20:52:57.673
as0044    2010-08-16 20:45:51.210
snb0006   2010-08-16 20:33:29.873
weo0021   2010-08-16 19:54:57.093

如您所见,用户“jrc0014”在同一分钟内多次登录。如何编写查询,以便用户只登录一次,如下所示:

(期望的结果)

username  logged
------------------
kh0013    2010-08-16 21:29:21.020
tmt0006   2010-08-16 21:24:16.030
jrc0014   2010-08-16 21:17:00.593
jrm0017   2010-08-16 20:52:57.673
as0044    2010-08-16 20:45:51.210
snb0006   2010-08-16 20:33:29.873
weo0021   2010-08-16 19:54:57.093

【问题讨论】:

  • 您当前的选择语句是什么?为什么即使在一分钟之内也只需要一条记录? “SELECT username, MAX(logged) FROM Logins”会有用吗?

标签: sql sql-server tsql


【解决方案1】:

要获得您列出的输出,请使用:

  SELECT yt.username , 
         MAX(yt.logged) AS logged
    FROM YOUR_TABLE yt
GROUP BY yt.username, DATEADD(minute,DATEDIFF(minute,0,logged),0)

【讨论】:

  • 感谢您的快速响应。这个查询效果很好。我知道这不在我的问题之内,但下面的几个回答让我想到可以自定义“1 分钟”。换句话说,我可以输入一个记录可以彼此分开的秒数的值,以确定是否显示它们。在您的查询中,是否将其硬编码为一分钟?
  • @strazz:SQL 应该被认为是“硬编码的”——如果不实际使用动态 SQL 语法,它支持的“动态”并不多。如果您想支持一分钟以外的时间范围,则必须调整 GROUP BY,即 DATEADD 部分,专门根据您所需的时间范围进行分组。
  • 感谢您的快速回复...您介意给我一个修改 30 秒和 90 秒的示例吗?这将帮助我完全理解查询,我会很高兴去!我也将您的帖子标记为答案。再次感谢。
  • @strazz:我建议为此提出一个新问题 - 语法不太可能相同,它也让其他人有机会回答。
【解决方案2】:

在 SQL Server 中,将日期时间设置为分钟,如下所示:

SELECT DISTINCT
    username , DATEADD(minute,DATEDIFF(minute,0,logged),0) AS logged
    FROM YourTable

【讨论】:

    【解决方案3】:
    select username, logged
      from Logins o
     where not exists(select 1 
                        from Logins i
                       where i.username = o.username
                         and datediff(second, i.logged, o.logged) <= 60)
                     )
    

    【讨论】:

    • 由于某种原因,此查询未返回任何行。然而,OMG Ponies 的上述查询确实有效。
    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多