我有一张表格,其中包含以下字段:
我要做的是按UpdatedTime
对记录进行分组,并计算每个组的数字 (实际上我只希望从所有组中获取最大数量)< / EM> 即可。对于每个组,UpdatedTime
的最大差异小于常数,例如2秒或10分钟。
如何在此约束下对记录进行分组和计数?
例如:
常数= 2秒
{ID:1,UpdatedTime:2017-03-23 00:00:00}
{ID:2,UpdatedTime:2017-03-23 00:00:02}
{ID:3,UpdatedTime:2017-03-23 00:00:04}
期望的结果就像
第1组:{ID:1,ID:2},第2组:{ID:2,ID:3}
因此每个小组的计数为2。 ID = 2出现在预期的两个组中。
PS:并非真的必须明确找到该群组,我想要的只是(最大)数
答案 0 :(得分:0)
试试这个:
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
答案 1 :(得分:0)
希望这适合你。
;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
)