我试图在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;