我有一些代表不同'行动'的数据。这些“行动”共同构成了一个“事件”。
数据如下所示:
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
正如您所看到的,每个单独的'事件'都是由一个或多个'动作'组成的(或者我想到它们,'子事件')。
我需要识别每个“子事件”并为其指定标识符。这就是我要找的内容:
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
我需要一些可以开始计数的东西,但只有当某列具有特定值时才会增加(例如“Action”=“Start”)。
我一直在尝试使用Window Functions,但成效有限。我似乎无法找到一种我觉得可行的解决方案......有什么想法吗?
答案 0 :(得分:6)
如果您有一些可以排序的字段,则可以使用以下查询(未经测试):
SELECT
sum(("Action" = 'Start')::int) OVER (PARTITION BY "EventID" ORDER BY "Timestamp" ROWS UNBOUNDED PRECEDING)
FROM
events
请注意,如果第一个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 ;
SQL-Fiddle的测试: test