Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 如何计算一段时间内的数字id_Sql_Sql Server_Count - Fatal编程技术网

Sql 如何计算一段时间内的数字id

Sql 如何计算一段时间内的数字id,sql,sql-server,count,Sql,Sql Server,Count,我正在寻找一种方法来计算一段时间内每30分钟的id数 我编写了一个SQL查询,但结果不正确 CREATE TABLE [dbo].[#tabl] ( [Id] [varchar](100) NULL, [TIMEStart] [datetime] NULL, [TIMEEnd] [datetime] NULL ) ON [PRIMARY] INSERT INTO [dbo].[#tabl] VALUES ('1', '2020-04-01 00:05:00.000',

我正在寻找一种方法来计算一段时间内每30分钟的id数

我编写了一个SQL查询,但结果不正确

CREATE TABLE [dbo].[#tabl]
(
    [Id] [varchar](100) NULL,
    [TIMEStart] [datetime] NULL,
    [TIMEEnd] [datetime] NULL
) ON [PRIMARY]


INSERT INTO [dbo].[#tabl] VALUES ('1', '2020-04-01 00:05:00.000', '2020-04-01 00:10:00.000')
INSERT INTO [dbo].[#tabl] VALUES ('2', '2020-04-01 00:11:00.000', '2020-04-01 00:29:00.000')
INSERT INTO [dbo].[#tabl] VALUES ('3', '2020-04-01 00:12:00.000', '2020-04-01 00:55:00.000')

WITH CTE AS 
(
    SELECT
        [Id], 
        DATEADD(MINUTE, (DATEDIFF(MINUTE, [TIMEStart], [TIMEEnd]) / 30) * 30, 0) AS RangeTime
    FROM
        [dbo].[#tabl]
    GROUP BY
        [Id], DATEADD(MINUTE, (DATEDIFF(MINUTE, [TIMEStart],[TIMEEnd]) / 30) * 30, 0)
)
SELECT numreq, RangeTime
FROM 
    (SELECT COUNT(DISTINCT id) AS numreq, RangeTime
     FROM CTE
     GROUP BY RangeTime) temp
正确的结果-表:

numreq       RangeTime
-------------------------------------
3            1900-01-01 00:00:00.000 
1            1900-01-01 00:30:00.000 
期间:

1900-01-01 00:00:00.000 - includes 3 id:1, 2, 3
1900-01-01 00:30:00.000 - includes 1 id:1

我认为您需要创建一个
RangeTime
值列表,这些值位于
TIMEStart
TIMEEnd
值的范围内(可以使用递归CTE执行),然后,您可以在重叠的时间范围内
将该列表连接回
tabl
,并计算每个
范围时间重叠的行数:

WITH CTE AS (
  SELECT DATEADD(MINUTE,(DATEDIFF(MINUTE, 0, MIN([TIMEStart]))/30)*30,0) as RangeTime, 
         MAX([TIMEEnd]) AS MaxTime
  FROM [dbo].[tabl]
  UNION ALL
  SELECT DATEADD(MINUTE, 30, RangeTime), MaxTime
  FROM CTE
  WHERE DATEADD(MINUTE, 30, RangeTime) < MaxTime
)
SELECT RangeTime, COUNT(tabl.Id) AS numreq 
FROM CTE
LEFT JOIN tabl ON tabl.TIMEStart < DATEADD(MINUTE, 30, RangeTime)
              AND RangeTime <= tabl.TIMEEnd
GROUP BY RangeTime


注意:我假设您想要的是该范围的实际时间,而不是1900年初开始的时间…

您有日历表吗?您是否希望输出在30分钟内可能有0个事件?或者,你只是在问如何“将一个时间循环到最接近的30分钟”
RangeTime               numreq
2020-04-01T00:00:00Z    3
2020-04-01T00:30:00Z    1