我有一些代表不同“行动”的数据。这些“ Action ”共同构成一个“事件”。

数据如下所示:

    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

如您所见,每个“事件”都是由一个或多个“ Action ”(或我认为是“子事件”)组成的。

我需要识别每个“子事件”并为其指定一个标识符。 这是我在寻找的东西:
    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')时才递增。

我一直在尝试使用窗口函数,但是效果有限。我似乎无法找到我认为可行的解决方案...有什么想法吗?

最佳答案

如果您可以对某些字段进行排序,则可以使用以下查询(未经测试):

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

关于sql - Postgres 9.1-为行编号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14082341/

10-09 00:54
查看更多