sql - 每分钟计算两列的行数

标签 sql sql-server sql-server-2012

我有一个包含 session 的 SQL Server 2012 表,开始时间和结束时间为 2。我现在需要知道每分钟有多少个 session 处于事件状态,这意味着 >= 开始时间且 <= 结束时间。

示例

Order_strUserId | Order_dtmInitiated      | Order_dtmLastUpdated
s2ir1f8vqx      | 2016-12-13 15:06:17.993 | 2016-12-13 15:06:59.723
4839m6lnjchn    | 2016-12-13 15:09:42.807 | 2016-12-13 15:12:21.220
y7k3u6q1wjn     | 2016-12-13 15:11:40.173 | 2016-12-13 15:12:01.630
sdc74a0ahid     | 2016-12-13 15:14:06.013 | 2016-12-13 15:14:28.703
2pgj2ixpta9     | 2016-12-13 15:17:41.567 | 2016-12-13 15:17:42.063
qlfv4vmxdb      | 2016-12-13 15:18:17.750 | 2016-12-13 15:18:47.227
y9jd24i59x5v    | 2016-12-13 15:19:30.160 | 2016-12-13 15:19:30.607
9vb2d6u90hn     | 2016-12-13 15:22:09.257 | 2016-12-13 15:22:09.743

第 1 行仅计算 2016-12-13 15:06,第 2 行计算 2016-12-13 15:09 和 2016-12-13 15:12 之间的每分钟等。

我需要的是类似的东西

Time             | ActiveSessions
2016-12-13 15:06 | 1
2016-12-13 15:09 | 1
2016-12-13 15:10 | 1
2016-12-13 15:11 | 2
2016-12-13 15:12 | 2

如何做到这一点?

到目前为止,我的想法是按分钟计算 UserId,然后将所需的时间添加到计数中。但我不知道如何计算这个。

SELECT COUNT(t.UserSessionId) ,
    DATEPART( yyyy , t.TimeInitiated) AS 'Year', 
    DATEPART(MM, t.TimeInitiated) 'Month', 
    DATEPART(DD, t.TimeInitiated) 'Day', 
    DATEPART(HH, t.TimeInitiated) 'Hour', 
    DATEPART(MI, t.TimeInitiated) 'Minute', 
    t.TimeNeeded
FROM ( SELECT DATEDIFF(MI, Order_dtmInitiated, Order_dtmLastUpdated) AS 'TimeNeeded',
        Order_strUserId AS 'UserSessionId',
        Order_dtmInitiated AS 'TimeInitiated'
    FROM tblOrder ) t
GROUP BY DATEPART( yyyy , t.TimeInitiated), DATEPART(MM, t.TimeInitiated), DATEPART(DD, t.TimeInitiated), DATEPART(HH, t.TimeInitiated), DATEPART(MI, t.TimeInitiated), t.TimeNeeded

最佳答案

您需要一个带有分钟的日历表

;WITH cte
     AS (SELECT Min(Cast(Dateadd(minute, Datediff(minute, 0, Order_dtmInitiated), 0) AS SMALLDATETIME))   AS st_date,
                Max(Cast(Dateadd(minute, Datediff(minute, 0, Order_dtmLastUpdated), 0) AS SMALLDATETIME)) ed_date
         FROM   Yourtable
         UNION ALL
         SELECT Dateadd(minute, 1, st_date),
                ed_date
         FROM   cte
         WHERE  st_date < ed_date)
SELECT st_date,
       Count(1)
FROM   cte a
       LEFT JOIN Yourtable b
              ON a.st_date >= Cast(Dateadd(minute, Datediff(minute, 0, Order_dtmInitiated), 0) AS SMALLDATETIME)
                 AND a.st_date <= Cast(Dateadd(minute, Datediff(minute, 0, Order_dtmLastUpdated), 0) AS SMALLDATETIME)
GROUP  BY st_date
OPTION (maxrecursion 0) 

我已经使用Recursive CTE来生成日期,但我更喜欢在我的数据库中创建一个Calendar表并在这样的查询中使用它

关于sql - 每分钟计算两列的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674419/

相关文章:

sql - 如何在 SQL Server 中对包含数字和字母的 varchar 列进行排序?

java - JTDS - java.sql.SQLException : I/O Error: Connection reset by peer: socket write error

SQL close close 随着时间的推移数据中的差距

mysql - SQL IN 语句的限制

mysql - 如何在触发器 INSERT AFTER mysql 中执行过程?

MySQL 插入条件

sql-server - 友情网站数据库设计

sql-server - SQL Server 2005 Express 其他用户看不到存储过程

php - 是否可以通过内连接查询Mysql

sql-server - Powershell SQL 服务器数据库连接和连接超时问题