我有一张表,它有以下几个字段:
我要做的是按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:不一定要明确地找到这个组,我只想要(最大)计数。
发布于 2017-03-23 02:45:56
试试这个:
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发布于 2017-03-23 08:04:38
希望这对你有用。
;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
)https://stackoverflow.com/questions/42965955
复制相似问题