Postgres 9.1 - 对行组进行编号

los*_*rse 6 sql postgresql

我有一些代表不同"行动"的数据.这些"行动"共同构成"事件".

数据如下所示:

    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,但成效有限.我似乎无法找到一种我觉得可行的解决方案......任何想法?

Thi*_*ilo 6

如果您有一些可以排序的字段,则可以使用以下查询(未经测试):

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)

SQL-Fiddle的测试:测试