SQL 查询 - 跟踪中断序列中的哪些行彼此相关

SQL query - tracking which rows in an interrupted sequence are related to eachother

我有一个 table 由用户查看文件时记录的操作组成。当用户查看文件时,随着时间的推移,这可能会导致多项操作。由于多个用户可以同时处于活动状态,因此他们的操作可以交织在一起。

我希望在我的查询中创建一个额外的列,告诉我用户何时开始查看此文件(我们称之为 StartId)。

当用户停止查看文件以查看其他文件,然后返回查看第一个文件时,这应被视为新的查看会话。

这个 table 说明了我的问题和我想要的结果:

Id User File StartId (desired result)
1 A X 1
2 A X 1
3 B Y 3
4 A X 1
5 B Y 3
6 A Y 6
7 A X 7

我最接近的是这条线:

StartId = FIRST_VALUE(Id) OVER (PARTITION BY User, File ORDER BY Id)

但是,示例中最后一个操作的结果如下:

Id User File StartId
7 A X 1

有人能用这个给我指明正确的方向吗?

您可以使用 LAG 查看同一用户的先前文件是否与该用户的当前文件相同,以及我们是否处于新会话中,然后相应地使用该结果.

WITH T AS
(
SELECT *, 
       CASE WHEN "File" = LAG("File") OVER (PARTITION BY "User" ORDER BY "Id") THEN NULL ELSE "Id" END AS NewSessionFlag
FROM  YourTable
)
SELECT *, 
       MAX(NewSessionFlag) OVER (PARTITION BY "User" ORDER BY "Id" ROWS UNBOUNDED PRECEDING)
FROM T
ORDER BY "Id"

DB Fiddle