如果在30分钟内发生了多次事件,则返回SQL Server查询

时间:2017-03-18 13:24:07

标签: sql-server

我有一个用户正在做24小时的事情,我想看看他是否做了5次30分钟。到目前为止,我正在尝试使用此查询,但是,请不要介意我在count()之后放在方括号中它显示的数字对我没有任何意义... 5或6.并且列名为日期和小时显示一小时也很奇怪。

SELECT 
    User_ID,
    DateAdd(mi, 30, Event_Time),
    count(???) AS NumOFTimes
FROM 
    Table_Name
GROUP BY 
    User_ID, DateAdd(mi, 30, (Event_Time))
HAVING 
    COUNT(User_ID) >= 5
ORDER BY 
    User_ID

结果输出:

+---------+-------------------------+-------+
| user_ID |     (no colum name)     | times |
+---------+-------------------------+-------+
|  295791 | 2017-02-14 19:54:00.000 |     5 |
|  569676 | 2017-02-14 15:34:00.000 |     6 |
|  591081 | 2017-02-14 08:34:00.000 |     6 |
|  803702 | 2017-02-14 12:44:00.000 |     5 |
|  832821 | 2017-02-14 15:23:00.000 |     5 |
+---------+-------------------------+-------+

感谢您的时间和支持!

2 个答案:

答案 0 :(得分:0)

SELECT USER_ID, EVENT_TIME, CT
    FROM TABLE_NAME T
    CROSS APPLY
    (
        SELECT COUNT(*) CT FROM TABLE_NAME T2
        WHERE T.USER_ID = T2.USER_ID
        AND T2.EVENT_TIME BETWEEEN T1.EVENT_TIME AND DATEADD(N, 30, T1.EVENT_TIME)
    ) CTS
    WHERE CTS.CT >= 5

对于TABLE_NAME中的每一行,此查询将识别同一用户在30分钟内的记录数。这种方法可能不具备性能,因为它需要为每条记录单独查询,如果表格很大,则建议包含EVENT_TIME的USER_ID上的索引。

答案 1 :(得分:0)

使用子查询添加基于end_time的{​​{1}}和自我加入,以及现有user_id和计算event_time之间的event_time:< / p>

end_time