Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何分组和统计每个分组的数据数量';s的时间范围是否在常数范围内?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何分组和统计每个分组的数据数量';s的时间范围是否在常数范围内?

Sql 如何分组和统计每个分组的数据数量';s的时间范围是否在常数范围内?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含以下字段的表: ID(主键,整数,非空) UpdateTime(日期时间,非空) 我试图做的是按updatetime对记录进行分组,并计算每个组的数量(实际上我只想得到所有组的最大计数)。对于每个组,updateTime的最大差值小于一个常数,例如2秒或10分钟 如何在此约束下对记录进行分组和计数 例如: 常数=2秒 {ID:1,更新时间:2017-03-23 00:00:00} {ID:2,更新时间:2017-03-23 00:00:02} {ID:3,更新时间:2017-03-

我有一个包含以下字段的表:

  • ID(主键,整数,非空)
  • UpdateTime(日期时间,非空)
  • 我试图做的是按
    updatetime
    对记录进行分组,并计算每个组的数量(实际上我只想得到所有组的最大计数)。对于每个组,
    updateTime
    的最大差值小于一个常数,例如2秒或10分钟

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


    例如:

    常数=2秒

    {ID:1,更新时间:2017-03-23 00:00:00}

    {ID:2,更新时间:2017-03-23 00:00:02}

    {ID:3,更新时间:2017-03-23 00:00:04}

    期望的结果是

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

    所以每个组都有一个2的计数。 ID=2出现在预期的两个组中

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

    试试这个:



    希望这对你有用

    ;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
        )
    

    请编辑您的问题并提供示例数据和所需结果。而且,你的问题毫无意义。如果按
    updateTime
    分组,则结果集中的每一行都将有一个时间,最大值与最小值相同。@GordonLinoff更新了问题,抱歉混淆,我不是指SQL关键字“分组依据”,我想说的是如何找到
    updatetime
    中包含上述约束的数据组…再次为我的糟糕英语道歉
    ;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
        )