我有一些代表不同"行动"的数据.这些"行动"共同构成"事件".
数据如下所示:
EventID | UserID | Action | TimeStamp
--------------+------------+------------+-------------------------
1 | 111 | Start | 2012-01-01 08:00:00
1 | 111 | Stop | 2012-01-01 08:59:59
1 | 999 | Start | 2012-01-01 09:00:00
1 | 999 | Stop | 2012-01-01 09:59:59
1 | 111 | Start | 2012-01-01 10:00:00
1 | 111 | Stop | 2012-01-01 10:30:00
Run Code Online (Sandbox Code Playgroud)
如您所见,每个单独的"事件"都由一个或多个"动作"组成(或者我认为它们是"子事件").
我需要识别每个'子事件'并给它一个标识符.这就是我要找的东西:
EventID | SubeventID | UserID | Action | TimeStamp
--------------+----------------+------------+------------+-------------------------
1 | 1 | 111 | Start | 2012-01-01 08:00:00
1 | 1 | 111 | Stop | 2012-01-01 08:59:59
1 | 2 | 999 | Start | 2012-01-01 09:00:00
1 | 2 | 999 | Stop | 2012-01-01 09:59:59
1 | 3 | 111 | Start | 2012-01-01 10:00:00
1 | 3 | 111 | Stop | 2012-01-01 10:30:00
Run Code Online (Sandbox Code Playgroud)
我需要一些可以开始计数的东西,但只有在某些列具有特定值时才会增加(例如"Action"="Start").
我一直在尝试使用Window Functions,但成效有限.我似乎无法找到一种我觉得可行的解决方案......任何想法?
如果您有一些可以排序的字段,则可以使用以下查询(未经测试):
SELECT
sum(("Action" = 'Start')::int) OVER (PARTITION BY "EventID" ORDER BY "Timestamp" ROWS UNBOUNDED PRECEDING)
FROM
events
Run Code Online (Sandbox Code Playgroud)
请注意,如果第一个SubEvent不以Start开头,则它的事件ID为0,这可能不是您想要的.
你也可以用来COUNT()代替SUM():
SELECT
EventID
, COUNT(CASE WHEN Action = 'Start' THEN 1 END)
OVER ( PARTITION BY EventID
ORDER BY TimeStamp
ROWS UNBOUNDED PRECEDING )
AS SubeventID
, UserID
, Action
FROM
tableX AS t ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |