【问题标题】:Group data rows by near time按近时间分组数据行
【发布时间】:2013-08-20 09:24:09
【问题描述】:

这是我面临的问题: 我有一个包含行的大表,我想按时间对它们进行分组,更具体地说,时间差小于 2 分钟,示例如下 输入数据如下:

  • 16:01:01
  • 早 16:01:20
  • C 16:14:02
  • 下午 16:15:01
  • 欧洲 16:20:02

预期结果是

16:01:01 2
16:14:02 2
16:20:02 1

【问题讨论】:

  • 什么版本的 SQL Server?
  • 如果您有时间为 16:02:15、16:03:13 的行,它们是否属于第一组?
  • 罗曼,是的,应该属于同一组

标签: sql-server datetime group-by


【解决方案1】:

如果您使用的是 SQL Server 2012,那么您很幸运,您可以使用 lag 函数和滚动总数 sum

with cte as (
    select
        case
            when datediff(mi, lag(data) over (order by data), data) <= 1 then 0
            else 1
        end as ch,
        data
    from test
), cte2 as (
    select
        data, sum(ch) over (order by data) as grp
    from cte
)
select
    min(data) as data, count(*) as cn
from cte2
group by grp

sql fiddle demo

【讨论】:

    【解决方案2】:
    SELECT CONVERT(VARCHAR(8),
                   DATEADD(minute, (DATEDIFF(n, 0, time) / 2) * 2, 0),
                   108),
           COUNT(*)
    FROM times
    GROUP BY DATEDIFF(n, 0, time) / 2
    

    解释: CONVERThh:mm:ss 格式 (= 108) 显示 DateTimeDATEDIFF 转换为分钟,然后除以 2,四舍五入为整数,因此每个 2 分钟的 GROUP 解析为相同的整数。 DATEADD 用于将此分钟数转换回 DateTime,乘以 2 以返回正确的(四舍五入)时间。

    SQL Fiddle Demo

    【讨论】:

      【解决方案3】:
      Declare @m_TestTable table
      (
      DateRecorded datetime
      
      )
      
      Insert into @m_TestTable Values ('16:01:01' )
      Insert into @m_TestTable Values ('16:01:20' )
      Insert into @m_TestTable Values ('16:14:02' )
      Insert into @m_TestTable Values ('16:15:01' )
      Insert into @m_TestTable Values ('16:20:01' );
      
      With tblDifference as
      (
      Select Row_Number() OVER (Order by DateRecorded) as RowNumber,DateRecorded from @m_TestTable
      )
      
      select cur.DateRecorded as prvD, prv.DateRecorded as prvC, dateDiff(n, cur.DateRecorded,prv.DateRecorded)  from tblDifference cur LEFT OUTER JOIN tblDifference prv 
      ON cur.RowNumber = prv.RowNumber + 1
      

      这将为您提供 2 行之间的时间差(以分钟为单位)。您可以选择时差小于 2 分钟的任何行。它还将为您提供上限值和下限值。

      找出相隔不到 2 分钟的任何值应该很有用。

      prvD                    prvC                    Diff
      1900-01-01 16:01:01.000 NULL                    NULL
      1900-01-01 16:01:20.000 1900-01-01 16:01:01.000 0
      1900-01-01 16:14:02.000 1900-01-01 16:01:20.000 -13
      1900-01-01 16:15:01.000 1900-01-01 16:14:02.000 -1
      1900-01-01 16:20:01.000 1900-01-01 16:15:01.000 -5
      

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 2021-07-07
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2018-09-01
        相关资源
        最近更新 更多