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"
我有一个 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"