根据 15 分钟的间隔获取计数

Chi*_*kar 0 sql-server date count

我正在使用 SQL Server 2008 R2,我有一张表:

tbl_calls

cl_Id
cl_StartDate
cl_endDate
Run Code Online (Sandbox Code Playgroud)

我传递两个参数@StartDate@EndDate给我的存储过程。

我的要求是在每 15 分钟的持续时间内获取记录数

例子:

@StartDate = '2015-11-16 00:00:00.000', 
@EndDate = '2015-11-16 23:59:00.000'
Run Code Online (Sandbox Code Playgroud)

输出应该是:

Date                        Count
2015-11-16 00:00:00.000      10(Count of startDate between '2015-11-16 00:00:00.000' AND '2015-11-16 00:15:00.000')
2015-11-16 00:15:00.000       7(Count of startDate between '2015-11-16 00:15:00.000' AND '2015-11-16 00:30:00.000')
2015-11-16 00:30:00.000      50(Count of startDate between '2015-11-16 00:30:00.000' AND '2015-11-16 00:45:00.000')

upto @EndDate
Run Code Online (Sandbox Code Playgroud)

我试图这样做但没有得到想法,我不确定下面的查询是否接近逻辑。

我试过的是:

DECLARE @StartDate DATETIME = DATEADD(DAY,-1,GETUTCDATE()),
        @EndDate DATETIME = GETUTCDATE()

SELECT New 
FROM
    (SELECT 
         (CASE 
             WHEN cl_StartTime BETWEEN @StartDate AND DATEADD(MINUTE, 15, @StartDate) 
                THEN 1 
                ELSE 0 
          END) AS New 
     FROM          
         tbl_Calls WITH (NOLOCK)    
     WHERE 
         cl_StartTime BETWEEN @StartDate AND @EndDate) AS Inners 
GROUP BY 
    New
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息,请告诉我。

谢谢你。

Fel*_*tan 5

首先,你需要生成全部15分钟的间隔从开始@StartDate@EndDate。您可以在Tally Table的帮助下完成此操作然后做一个LEFT JOINontbl_calls来统计调用次数:

SQL小提琴

DECLARE @StartDate  DATETIME = '2015-11-16 00:00:00.000',
        @EndDate    DATETIME = '2015-11-16 23:59:00.000'

DECLARE @nRows INT

SELECT @nRows = DATEDIFF(MINUTE, @StartDate, DATEADD(DAY, 1, CAST(@EndDate AS DATE))) / 15

;WITH E1(N) AS(
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b),
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b),
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b),
Tally(N) AS(
    SELECT TOP(@nRows)
        ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
    FROM E8
),
Intervals(sd, ed) AS(
    SELECT
        DATEADD(MINUTE, (t.N - 1) * 15, @StartDate),
        DATEADD(MINUTE, N * 15, @StartDate)
    FROM Tally t
)
SELECT 
    i.sd, i.ed, cnt = COUNT(c.cl_Id)
FROM Intervals i
LEFT JOIN tbl_calls c
    ON i.sd <= c.cl_EndDate
    AND i.ed > c.cl_Startdate
GROUP BY i.sd, i.ed
Run Code Online (Sandbox Code Playgroud)

请注意,这里生成的间隔是从+ 1 天@StartDate的开始@EndDate,意思是从'2015-11-16 00:00:00.000''2015-11-17 00:00:00.000'

此外,JOIN条件指定呼叫持续时间必须介于间隔开始和间隔结束之间,但间隔结束不得与呼叫持续时间重叠。您可以查看此答案以获取更多解释。

您可以JOIN根据自己的喜好修改条件,但这基本上是要点。