重复会话记录-结束除最新记录外的所有记录



我试图在sql server的日志表中识别重复的会话。

用户一次只能有一个打开的登录会话,但有时当应用程序崩溃时,它会使用户会话打开,从而导致问题。

我想找到所有有多个开放会话的用户(结束日期为空),然后在所有的结束日期,但最近的开放会话。

表列示例如下Username, start_time, end_time

示例数据

henrya  2023-03-30 11:15:00.493 NULL
henrya  2023-03-30 11:00:00.493 NULL
henrya  2023-03-30 10:15:00.493 10:30:00.493
qwertya  2023-03-30 12:15:00.493 NULL
qwertya  2023-03-30 12:00:00.493 NULL
qwertya  2023-03-30 10:15:00.493 NULL

我在使用更新脚本结束每个用户除最新会话外的所有会话时遇到困难。

要找到所有额外的行,您可以使用ROW_NUMBER。您可以为此使用可更新的CTE或子查询,并直接对其进行更新,而无需重新连接

WITH cte AS (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY Username ORDER BY start_time DESC)
FROM YourTable
WHERE end_time IS NULL
)
UPDATE cte
SET end_time = SYSUTCDATETIME()
WHERE rn > 1;

最新更新