6

さまざまな「アクション」を表すデータがあります。これらの「アクション」をまとめて「イベント」を構成します。

データは次のようになります。

    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

ご覧のとおり、各「イベント」は 1 つまたは複数の「アクション」(または、私が考えるところの「サブイベント」) で構成されています。

各「サブ イベント」を識別し、識別子を付ける必要があります。これは私が探しているものです:

    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

カウントを開始できるものが必要ですが、一部の列に特定の値がある場合にのみ増加します (「アクション」=「開始」など)。

これにはウィンドウ関数を使用しようとしましたが、成功は限られています。うまくいくと思う解決策が見つからないようです...何か考えはありますか?

4

1 に答える 1

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

于 2012-12-29T14:11:23.650 に答える