我正在尝试识别 sql server 上日志表中的重复会话。
用户一次只能打开一个登录会话,但有时当应用程序崩溃时,它会使用户会话保持打开状态,从而导致问题。
我想找到所有具有多个打开会话的用户(结束日期将为空),然后在除最新打开会话之外的所有用户上设置结束日期。
示例表列是 用户名、开始时间、结束时间
示例数据
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;