Sql server 查找最大simultanius发生次数,如果符合条件,则增加变量

Sql server 查找最大simultanius发生次数,如果符合条件,则增加变量,sql-server,stored-procedures,aggregate-functions,sql-server-2019,Sql Server,Stored Procedures,Aggregate Functions,Sql Server 2019,我有一项任务,就是将进入一组给定端口(中继)的几个连接汇总到时间段中,并计算结果。我想实现两种类型的计数: 一次计数应计算到给定插槽中的中继线的连接总数(每个插槽30分钟) 其次,我想找出同时发生的最大连接数:例如总共有10个连接,但其中只有3个同时连接。表中的注释表示“计数组” 表:原始数据 GatewayName StartDateTime DisconnectDateTime ConDur Trunk GW1 2021-02-24 20:01:00.0 2021-02-24 20:05

我有一项任务,就是将进入一组给定端口(中继)的几个连接汇总到时间段中,并计算结果。我想实现两种类型的计数:

  • 一次计数应计算到给定插槽中的
    中继线的连接总数(每个插槽30分钟)
  • 其次,我想找出同时发生的最大连接数:例如总共有10个连接,但其中只有3个同时连接。表中的注释表示“计数组”
表:原始数据

GatewayName StartDateTime DisconnectDateTime ConDur Trunk
GW1 2021-02-24 20:01:00.0 2021-02-24 20:05:30.0 270000 T1--1,下一步。在discon之前启动
GW1 2021-02-24 20:04:50.0 2021-02-24 20:08:24.0 214000 T1--2
GW12021-02-2420:05:20.6 2021-02-2420:07:50.1149500 T1--3
GW1 2021-02-24 20:15:50.0 2021-02-24 20:17:00.0 70000 T1--0
GW1 2021-02-24 20:20:50.0 2021-02-24 20:21:00.0 10000 T1--1
GW1 2021-02-24 20:20:59.0 2021-02-24 20:24:00.0 181000 T1--2
GW1 2021-02-24 20:23:59.0 2021-02-24 20:28:30.0 271000 T1--3
GW1 2021-02-24 20:26:00.0 2021-02-24 20:29:30.0 210000 T1--4
GW1 2021-02-24 20:27:00.0 2021-02-24 20:29:31.0 151000 T1--5
GW3 2021-02-24 22:46:54.2 2021-02-24 22:48:25.2 91000 T1--0
GW2 2021-02-24 20:41:49.0 2021-02-24 20:43:24.0 95000 T2--0
GW99 2021-02-2422:47:25.1 2021-02-2422:47:54.429300T2--0
迄今为止的结果 我正在运行一个存储过程,创建一个用于生成时间段的计数表

此外,我还创建了一个临时表,在运行时隙排序之前运行,该表的目的是查看下一行
StartDateTime
,查看它是否在当前行
DisconnectDateTime
之前。此表是作为测试表构建的,以查看是否可以在满足零(0)之前以某种方式对事件进行计数和分组,以便稍后执行
max
以一次获得最大数量的事件。不幸的是,我没能弄明白这个机制

GatewayName StartDateTime DisconnectDateTime ConDur Trunk nrDDT sim卡
GW1 2021-02-24 20:01:00.0 2021-02-24 20:05:30.0 270000 T1 2021-02-24 20:04:50.0 1--计数下面的行
GW1 2021-02-24 20:04:50.0 2021-02-24 20:08:24.0 214000 T1 2021-02-24 20:05:20.6 1--已计数
GW1 2021-02-2420:05:20.6 2021-02-2420:07:50.1149500 T1 2021-02-2420:15:50.0——已计数
GW1 2021-02-24 20:15:50.0 2021-02-24 20:17:00.0 70000 T1 2021-02-24 20:20:50.0--跳转到其他位置
GW1 2021-02-24 20:20:50.0 2021-02-24 20:21:00.0 10000 T1 2021-02-24 20:20:59.0 1
GW1 2021-02-24 20:20:59.0 2021-02-24 20:24:00.0 181000 T1 2021-02-24 20:23:59.0 1
GW1 2021-02-24 20:23:59.0 2021-02-24 20:28:30.0 271000 T1 2021-02-24 20:26:00.1
GW1 2021-02-24 20:26:00.0 2021-02-24 20:29:30.0 210000 T1 2021-02-24 20:27:00.1
GW1 2021-02-24 20:27:00.0 2021-02-24 20:29:31.0 151000 T1 2021-02-24 22:46:54.2 0
GW3 2021-02-24 22:46:54.2 2021-02-24 22:48:25.2 91000 T1空0
GW2021-02-2420:41:49.021-02-2420:43:24.095000 t22021-02-2422:47:25.10
GW99 2021-02-24 22:47:25.1 2021-02-24 22:47:54.4 29300 T2空0
问题是,如果满足我的
case
条件(sim列),我想增加一个计数,我已经尝试使用全局变量和局部变量,但是它会为每一行重置,如果输入了我的
else
子句,我无法强制它返回到
0

创建或更改过程GenerateRunkSum
@日期时间2(7),
@句号int
作为
开始
声明@raw_数据表
(
网关名称varchar(23),
StartDateTime日期时间2(7),
断开日期时间日期时间2(7),
连接持续时间int,
主干varchar(10)
);
--创建测试数据
插入@raw_数据值('GW1','2021-02-24 20:01:00.0','2021-02-24 20:05:30.0','DATEDIFF(毫秒,'2021-02-24 20:01:00.0','2021-02-24 20:05:30.0','T1'))
插入@raw_数据值('GW1','2021-02-24 20:05:20.6','2021-02-24 20:07:50.1','DATEDIFF(毫秒,'2021-02-24 20:05:20.6','2021-02-24 20:07:50.1','T1'))
在@raw_数据值中插入('GW1','2021-02-24 20:04:50.0','2021-02-24 20:08:24.0','DATEDIFF(毫秒,'2021-02-24 20:04:50.0','2021-02-24 20:08:24.0','T1'))
插入@raw_数据值('GW1','2021-02-24 20:15:50.0','2021-02-24 20:17:00.0','DATEDIFF(毫秒,'2021-02-24 20:15:50.0','2021-02-24 20:17:00.0','T1'))
插入@raw_数据值('GW1','2021-02-24 20:20:50.0','2021-02-24 20:21:00.0','DATEDIFF(毫秒,'2021-02-24 20:50.0','2021-02-24 20:21:00.0','T1'))
插入@raw_数据值('GW1','2021-02-24 20:20:59.0','2021-02-24 20:24:00.0','DATEDIFF(毫秒,'2021-02-24 20:20:59.0','2021-02-24 20:24:00.0','T1'))
在@raw_数据值中插入('GW1','2021-02-24 20:25:00.0','2021-02-24 20:28:30.0','DATEDIFF(毫秒,'2021-02-24 20:25:00.0','2021-02-24 20:28:30.0','T1'))
插入@raw_数据值('GW2','2021-02-24 20:41:49.0','2021-02-24 20:43:24.0','DATEDIFF(毫秒,'2021-02-24 20:41:49.0','2021-02-24 20:43:24.0','T2'))
插入@raw_数据值('GW3','2021-02-24 22:46:54.2','2021-02-24 22:48:25.2','DATEDIFF(毫秒,'2021-02-24 22:46:54.2','2021-02-24 22:48:25.2','T1'))
插入@raw_数据值('GW99','2021-02-24 22:47:25.1','
Trunk  Start                                Period   All  sim
T1       2021:02:24 22:30:0.0     1800      5     2
CREATE OR ALTER PROCEDURE [dbo].[GenerateTrunkSumv1]
@date datetime2(1),
@ST datetime2(1),
@DT datetime2(1),
@tn varchar(23),
@period int
AS
BEGIN

WITH TrunkGroup
AS (
    SELECT
        IngressTrunkGroup as Trunk
    ,StartDateTime
    ,DisconnectDateTime
    FROM 
        [dbo].[CDR_RAW]

    UNION ALL

    SELECT 
        EgressTrunkGroup
    ,StartDateTime
    ,DisconnectDateTime
    FROM 
        [dbo].[CDR_RAW]
),
Times AS
(SELECT
        rd.StartDateTime tm
    ,rd.Trunk
    FROM TrunkGroup rd
    UNION
    SELECT
        rd.DisconnectDateTime
    ,rd.Trunk
    FROM TrunkGroup rd),
intervals
AS
(SELECT
        tm tm1
    ,LEAD(tm, 1) OVER (PARTITION BY Trunk ORDER BY tm) tm2
    ,Trunk
    FROM Times)
SELECT
    i.Trunk
,i.tm1
,i.tm2
,COUNT(*) simultaneous
INTO #TEMP
FROM intervals i
INNER JOIN TrunkGroup rd
    ON rd.DisconnectDateTime >= i.tm1
        AND rd.StartDateTime < i.tm2
        AND i.Trunk = rd.Trunk
        AND i.tm2 IS NOT null
GROUP BY i.Trunk
        ,i.tm1
        ,i.tm2
ORDER BY i.Trunk,i.tm1

;

WITH Numbers(val) AS
(
SELECT
    1 
    
    UNION ALL
    
SELECT
    val + 1 
FROM
    numbers 
WHERE
    val < 48
)
SELECT
PeriodSummary.period_start
,PeriodSummary.period_end
,PeriodSummary.Period
,PeriodSummary.Trunk
,PeriodSummary.[all]
,PeriodSummary.simultaneous
FROM
(
    SELECT
    pers.period_start
    ,pers.period_end
    ,@period as [Period]
    ,src.Trunk
    ,src.simultaneous
    ,COUNT(*) as [all]
    FROM
    (
        SELECT
        dateadd(minute, (val - 1) * 30, '20210224') as period_start
        ,dateadd(minute, (val    ) * 30, '20210224') as period_end 
        FROM
        numbers
    ) pers 
INNER JOIN
    #TEMP as src 
    ON  src.tm1 >= pers.period_start
            AND src.tm1 < pers.period_end
GROUP BY
    src.Trunk
    ,pers.period_start
    ,pers.period_end
    ,src.simultaneous
) PeriodSummary

END
GO

EXECUTE [dbo].[GenerateTrunkSumv1] @date = '20210224', @period = 1800, @ST = '2021-02-24 20:00:00.0', @DT = '2021-02-24 22:30:00.0000000', @tn = 'test';
SELECT @@ROWCOUNT as 'Inserted'
GO
period_start              period_end                Period  Trunk   all     simultaneous
2021-02-24 20:00:00.0     2021-02-24 20:30:00.0     1800    I1      1       1
2021-02-24 20:00:00.0     2021-02-24 20:30:00.0     1800    I1      1       2
2021-02-24 20:30:00.0     2021-02-24 21:00:00.0     1800    I1      6       1
2021-02-24 20:30:00.0     2021-02-24 21:00:00.0     1800    I1      22      2
2021-02-24 20:30:00.0     2021-02-24 21:00:00.0     1800    I1      16      3
2021-02-24 20:30:00.0     2021-02-24 21:00:00.0     1800    I2      1       1
2021-02-24 20:30:00.0     2021-02-24 21:00:00.0     1800    I2      2       2
--Surrounding rows causing this issue
I1  2021-02-24 20:23:43.1   2021-02-24 20:24:34.6   1
I1  2021-02-24 20:24:34.6   2021-02-24 20:31:09.5   2
I1  2021-02-24 20:31:09.5   2021-02-24 20:32:32.9   3
I1  2021-02-24 20:32:32.9   2021-02-24 20:32:42.3   3
I1  2021-02-24 20:32:42.3   2021-02-24 20:32:51.4   3
I1  2021-02-24 20:32:51.4   2021-02-24 20:33:05.1   3
WITH Times
AS
(SELECT
        rd.StartDateTime tm
       ,rd.Trunk
    FROM #raw_data rd
    UNION
    SELECT
        rd.DisconnectDateTime
       ,rd.Trunk
    FROM #raw_data rd)
    
intervals
AS
(SELECT
        tm tm1
       ,LEAD(tm, 1) OVER (PARTITION BY Trunk ORDER BY tm) tm2
       ,Trunk
    FROM Times)
SELECT
    i.Trunk
   ,i.tm1
   ,i.tm2
   ,COUNT(*) simultaneous
FROM intervals i
INNER JOIN #raw_data rd
    ON rd.DisconnectDateTime >= i.tm1
        AND rd.StartDateTime < i.tm2
        AND i.Trunk = rd.Trunk
        AND i.tm2 IS NOT null
GROUP BY i.Trunk
        ,i.tm1
        ,i.tm2
ORDER BY i.trunk,i.tm1
+-------+-----------------------------+-----------------------------+--------------+
| Trunk |             tm1             |             tm2             | simultaneous |
+-------+-----------------------------+-----------------------------+--------------+
| T1    | 2021-02-24 20:01:00.0000000 | 2021-02-24 20:04:50.0000000 |            1 |
| T1    | 2021-02-24 20:04:50.0000000 | 2021-02-24 20:05:20.6000000 |            2 |
| T1    | 2021-02-24 20:05:20.6000000 | 2021-02-24 20:05:30.0000000 |            3 |
| T1    | 2021-02-24 20:05:30.0000000 | 2021-02-24 20:07:50.1000000 |            3 |
| T1    | 2021-02-24 20:07:50.1000000 | 2021-02-24 20:08:24.0000000 |            2 |
| T1    | 2021-02-24 20:08:24.0000000 | 2021-02-24 20:15:50.0000000 |            1 |
| T1    | 2021-02-24 20:15:50.0000000 | 2021-02-24 20:17:00.0000000 |            1 |
| T1    | 2021-02-24 20:17:00.0000000 | 2021-02-24 20:20:50.0000000 |            1 |
| T1    | 2021-02-24 20:20:50.0000000 | 2021-02-24 20:20:59.0000000 |            1 |
| T1    | 2021-02-24 20:20:59.0000000 | 2021-02-24 20:21:00.0000000 |            2 |
| T1    | 2021-02-24 20:21:00.0000000 | 2021-02-24 20:24:00.0000000 |            2 |
| T1    | 2021-02-24 20:24:00.0000000 | 2021-02-24 20:25:00.0000000 |            1 |
| T1    | 2021-02-24 20:25:00.0000000 | 2021-02-24 20:28:30.0000000 |            1 |
| T1    | 2021-02-24 20:28:30.0000000 | 2021-02-24 22:46:54.2000000 |            1 |
| T1    | 2021-02-24 22:46:54.2000000 | 2021-02-24 22:48:25.2000000 |            1 |
| T2    | 2021-02-24 20:41:49.0000000 | 2021-02-24 20:43:24.0000000 |            1 |
| T2    | 2021-02-24 20:43:24.0000000 | 2021-02-24 22:47:25.1000000 |            1 |
| T2    | 2021-02-24 22:47:25.1000000 | 2021-02-24 22:47:54.4000000 |            1 |
+-------+-----------------------------+-----------------------------+--------------+
WITH Times
AS
(SELECT
        rd.StartDateTime tm
       ,rd.Trunk
    FROM #raw_data rd
    UNION
    SELECT
        rd.DisconnectDateTime
       ,rd.Trunk
    FROM #raw_data rd),
intervals
AS
(SELECT
        tm tm1
       ,LEAD(tm, 1) OVER (PARTITION BY Trunk ORDER BY tm) tm2
       ,Trunk
    FROM Times)
SELECT
    i.Trunk
   ,i.tm1
   ,i.tm2
   ,COUNT(*) simultaneous
FROM intervals i
INNER JOIN #raw_data rd
    ON rd.DisconnectDateTime >= i.tm1
        AND rd.StartDateTime < i.tm2
        AND i.Trunk = rd.Trunk
        AND i.tm2 IS NOT null
GROUP BY i.Trunk
        ,i.tm1
        ,i.tm2
ORDER BY i.trunk,i.tm1