首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对每个组的时间范围在一个常数内的数据进行分组和计数?

如何对每个组的时间范围在一个常数内的数据进行分组和计数?
EN

Stack Overflow用户
提问于 2017-03-23 02:04:24
回答 2查看 49关注 0票数 0

我有一张表,它有以下几个字段:

  1. ID (PK,int,null)
  2. UpdatedTime(DateTime,null)

我要做的是按UpdatedTime对记录进行分组,并计算每个组的数量(实际上,我只想从所有组中获得最大计数)。对于每个组,UpdatedTime的最大差异小于一个常数,例如2秒或10分钟。

如何在此约束下对记录进行分组和计数?

例如:

常数=2秒

{ID: 1,UpdatedTime: 2017-03-23 00:00:00}

{ID: 2,UpdatedTime: 2017-03-23 00: 00:00:02}

{ID: 3,UpdatedTime: 2017-03-23 00: 00:00:04}

所期望的结果如下

第1组:{ID: 1,ID: 2},第2组:{ID: 2,ID: 3}

因此,每个组都有一个2.id=2的计数出现在两个组中,这是预期的。

PS:不一定要明确地找到这个组,我只想要(最大)计数

EN

回答 2

Stack Overflow用户

发布于 2017-03-23 02:45:56

试试这个:

代码语言:javascript
运行
复制
     DECLARE @TblUpdateTime AS TABLE
   (
      ID int,
      UpdatedTime datetime
   )

   INSERT INTO @TblUpdateTime VALUES (1, '2017-03-23 00:00:00')
   INSERT INTO @TblUpdateTime VALUES (2, '2017-03-23 00:00:02')
   INSERT INTO @TblUpdateTime VALUES (3, '2017-03-23 00:00:04')
   DECLARE @Constant int = 2 -- seconds



   ;WITH temp AS
      (
      SELECT tut.UpdatedTime, count(tut2.ID) AS grQuantity
      FROM @TblUpdateTime tut
      INNER JOIN @TblUpdateTime tut2 ON datediff(second, tut.UpdatedTime, tut2.UpdatedTime) BETWEEN 0 AND @Constant
      GROUP BY tut.UpdatedTime
      )
   SELECT max(t.grQuantity) AS MaxQuantity FROM temp t
   --SELECT max(t.grQuantity), t.UpdatedTime  AS MaxQuantity FROM temp t GROUP BY t.UpdatedTime -- If you want get max count by each UpdatedTime
票数 0
EN

Stack Overflow用户

发布于 2017-03-23 08:04:38

希望这对你有用。

代码语言:javascript
运行
复制
;WITH cte_inputData(Id, UpdatedTime) AS
(
SELECT 1, CAST('2017-03-23 00:00:00' AS DATETIME) UNION ALL
SELECT 2, CAST('2017-03-23 00:00:02' AS DATETIME) UNION ALL
SELECT 3, CAST('2017-03-23 00:00:04' AS DATETIME) UNION ALL
SELECT 4, CAST('2017-03-23 00:00:06' AS DATETIME) UNION ALL
SELECT 5, CAST('2017-03-23 00:00:16' AS DATETIME) UNION ALL
SELECT 6, CAST('2017-03-23 00:00:26' AS DATETIME) UNION ALL
SELECT 7, CAST('2017-03-23 00:00:36' AS DATETIME) UNION ALL
SELECT 8, CAST('2017-03-23 00:00:38' AS DATETIME) UNION ALL
SELECT 9, CAST('2017-03-23 00:00:40' AS DATETIME) UNION ALL
SELECT 10, CAST('2017-03-23 00:00:50' AS DATETIME) UNION ALL
SELECT 11, CAST('2017-03-23 00:01:00' AS DATETIME)
),
--Compensate for any Missing sequences in the ID
cte_Sequence(Id, OriginalID, UpdatedTime) AS (
    SELECT ROW_NUMBER() OVER (
            ORDER BY ID
            ) AS Id,
        Id AS OriginalID,
        UpdatedTime
    FROM cte_inputData
    ),
cte_BuildResult AS (
    SELECT b.Id,
        CAST(b.Id AS VARCHAR(10)) + ',' + CAST(a.OriginalID AS VARCHAR(10)) AS GroupNumber,
        DATEDIFF(SECOND, b.UpdatedTime, a.UpdatedTime) AS Differance
    FROM cte_Sequence a
    INNER JOIN cte_inputData b
        ON a.Id = b.ID + 1
    ),
cte_resultBuilderFinal(ID, Differance) AS (
    SELECT TOP 1 MAX(Id),
        MAX(Differance)
    FROM cte_BuildResult
    GROUP BY Differance
    ORDER BY MAX(Differance) DESC
    )

SELECT GroupNumber,
Differance
FROM cte_BuildResult b
WHERE EXISTS (
    SELECT 1
    FROM cte_resultBuilderFinal a
    WHERE a.ID = b.Id
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42965955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档