简体   繁体   English

以2分钟为间隔获取每种类型的总数

[英]Get the total count for each type in 2 mins interval

Get the total count for each type in 2 mins interval. 2分钟为间隔获取每种类型总数

INPUT or Table I have: 输入或表格我有:

在此处输入图片说明


Desired Output 期望的输出

在此处输入图片说明

I am struggling with the Query, how can I iterate through each 2 mins. 我在查询中苦苦挣扎,如何每2分钟进行一次迭代。

You need to create a calendar table and then join on it to get groups: 您需要创建一个日历表,然后加入该表以获取组:

DECLARE @t TABLE(t TIME, tp INT, cn INT)

INSERT INTO @t VALUES
('00:00:01', 1, 1),
('00:00:15', 2, 1),
('00:00:16', 2, 1),
('00:00:17', 2, 1),
('00:01:59', 3, 1),
('00:01:59', 3, 1)

;WITH tally AS(SELECT TOP 720 DATEADD(mi, 2 * ROW_NUMBER() 
                  OVER(ORDER BY(SELECT NULL)) - 2, CAST('00:00:00' AS TIME)) AS starttime,
                              DATEADD(ss, -1, DATEADD(mi, 2 * ROW_NUMBER() 
                  OVER(ORDER BY(SELECT NULL)) , CAST('00:00:00' AS TIME))) AS endtime
               FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n)
               CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n)
               CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t3(n))
SELECT ta.starttime, 
       ta.endtime, 
       t.tp, 
       SUM(t.cn) AS cn 
FROM @t t
JOIN tally ta ON t.t BETWEEN ta.starttime AND ta.endtime
GROUP BY t.tp, ta.starttime, ta.endtime

tally is you calendar table. tally是您的日历表。 Top 720 is just for full 24 hours. Top 720仅持续24小时。

Output: 输出:

starttime           endtime             tp  cn
00:00:00.0000000    00:01:59.0000000    1   1
00:00:00.0000000    00:01:59.0000000    2   3
00:00:00.0000000    00:01:59.0000000    3   2

If you want to include all types in each time group then you can do the following: 如果要在每个时间组中包括所有类型,则可以执行以下操作:

;WITH tally AS(SELECT TOP 720 DATEADD(mi, 2 * ROW_NUMBER() 
                  OVER(ORDER BY(SELECT NULL)) - 2, CAST('00:00:00' AS TIME)) AS starttime,
                              DATEADD(ss, -1, DATEADD(mi, 2 * ROW_NUMBER() 
                  OVER(ORDER BY(SELECT NULL)) , CAST('00:00:00' AS TIME))) AS endtime
               FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n)
               CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n)
               CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t3(n)),
      types AS(SELECT DISTINCT tp FROM @t)
SELECT ta.starttime, 
       ta.endtime, 
       tp.tp, 
       ISNULL(SUM(t.cn), 0) AS cn 
FROM tally ta 
CROSS JOIN types tp
LEFT JOIN @t t ON tp.tp = t.tp AND t.t BETWEEN ta.starttime AND ta.endtime
GROUP BY tp.tp, ta.starttime, ta.endtime
ORDER BY ta.starttime

You can use UNION ALL : 您可以使用UNION ALL

SELECT DISTINCT
   '00:00:00 - 00:01:59' AS [Time],
   [Type],
   SUM(Count) OVER(PARTITION BY [Type]) AS [Count]
FROM Your_Table
WHERE [Time] BETWEEN '00:00:00' AND '00:01:59'

UNION ALL

SELECT DISTINCT
   '00:02:00 - 00:02:59' AS [Time],
   [Type],
   SUM(Count) OVER(PARTITION BY [Type]) AS [Count]
FROM Your_Table
WHERE [Time] BETWEEN '00:02:00' AND '00:02:59'

UNION ALL

...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM