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