SQL Server 如何基于SQL中的另一列选择阈值之前的所有行

tjvv9vkg  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(125)

| 记录时间|会话ID|日志之间的时间|
| - ------| - ------| - ------|
| 12时00分01秒|AAAAAA|四个|
| 12时00分05秒|AAAAAA|四个|
| 12时00分09秒|AAAAAA|二九六|
| 12时05分05秒|AAAAAA|十个|
| 12时05分15秒|AAAAAA|零|
| 12时06分15秒|BBBBBB|十六|
| 12时06分31秒|BBBBBB|一百六十四|
| 12时09分15秒|BBBBBB|十个|
| 十二点九分二十五秒|BBBBBB|零|
| 十二点十一分四十五秒|中交|五个|
| 十二点十一分五十秒|中交|二十五|
| 十二点十二分十五秒|中交|零|
我有一个存储用户日志的数据库。它由

    • *[Log Time]**-DATETIME数据类型,为简单起见,我在这里排除了日期,我们可以假设所有行都在同一天
    • *[会话ID]**-VARCHAR数据类型,显示用户与应用程序交互的会话
    • *[Time Between Logs]**-INT数据类型,我自己编写了这个代码,以查找连续日志之间的时间(以秒为单位)。请注意,time between logs列显示当前列和下一列之间的时间,因此,特定[Session ID]的最后一个时间为NULL。
    • 目标**:我想排除用户离线一段时间,但应用在后台运行,因此会话ID保持不变的情况。当同一会话ID下的两个连续日志具有较大的[Time Between Logs]时,可以识别这些日志。在本例中,我将阈值取为2分钟因此,如果[Time Between Logs]超过120秒,则我们不应考虑该[Session ID]中的后续行。

我的最终目标是计算用户一天中每次会话的时长,通过删除后续日志来计算应用在后台运行的时间,这将变得更加准确。
因此,所需结果为
| 记录时间|会话ID|日志之间的时间|
| - ------| - ------| - ------|
| 12时00分01秒|AAAAAA|四个|
| 12时00分05秒|AAAAAA|四个|
| 12时00分09秒|AAAAAA|二九六|
| 12时06分15秒|BBBBBB|十六|
| 12时06分31秒|BBBBBB|一百六十四|
| 十二点十一分四十五秒|中交|五个|
| 十二点十一分五十秒|中交|二十五|
| 十二点十二分十五秒|中交|零|
到目前为止,我只能想出以下解决方案-

SELECT 
    [Log Time], [Session ID], [Time Between Logs]
FROM 
    LOG_TABLE AS [T1]
WHERE 
    [T1].[Log Time] < (SELECT MIN(T2.[Log Time]) 
                       FROM LOG_TABLE AS [T2]
                       WHERE T2.[Session ID] = T1.[Session ID] 
                         AND T2.[Time Between Logs] > 120)

但对于[Session ID]没有记录的情况,这不会给出任何记录

T2.[Time Between Logs] > 120

有人能帮我吗?先谢了。

dzhpxtsq

dzhpxtsq1#

不必深入研究以获得理想的解决方案,只需使用代码尝试将子查询 Package 在ISNULL()中,如下所示:

SELECT 
    [Log Time], [Session ID], [Time Between Logs]
FROM 
    LOG_TABLE AS [T1]
WHERE 
    [T1].[Log Time] <= ISNULL((SELECT MIN(T2.[Log Time]) 
                       FROM LOG_TABLE AS [T2]
                       WHERE T2.[Session ID] = T1.[Session ID] 
                         AND T2.[Time Between Logs] > 120), t1.[Log Time])

相关问题