1

Oracleで複数の行をまとめて集計する最良の方法を見つけようとしています。プロセス フローを通過する際の主要なユーザー イベントを記録するテーブルがあります。次のテーブル構造があります。

User Id    Event Code    Event Timestamp
1            START       17/06/2013 11:00
1            END         17/06/2013 11:05
2            START       16/06/2013 11:00
2            END         16/06/2013 11:05

以下の形式で、ユーザーの特定のイベント コードのタイムスタンプをキャプチャするレポートをデータベースから取得しようとしています。

User ID     Start Date/Time     End Date/Time
1           17/06/2013 11:00    17/06/2013 11:05
2           16/06/2013 11:00    16/06/2013 11:05

SQLだけでこれを行う方法がわからないので、アドバイスをいただければ幸いです。

4

4 に答える 4

3

テーブルが説明どおりであると仮定すると、これは単純な PIVOT で実行できます。

与えられた:

create table event ( id number, event_code varchar2(5), tstamp date );

insert into event values (1, 'START', to_date('17/06/2013 11:00','DD/MM/YYYY HH24:MI'));
insert into event values (1, 'END', to_date('17/06/2013 11:05','DD/MM/YYYY HH24:MI'));
insert into event values (2, 'START', to_date('16/06/2013 11:00','DD/MM/YYYY HH24:MI'));
insert into event values (2, 'END', to_date('16/06/2013 11:05','DD/MM/YYYY HH24:MI'));

クエリは次のようになります。

select *
  from event
 pivot ( max(tstamp) for event_code in ('START','END') )

ここにSQLフィドルがあります

于 2013-06-17T10:48:36.730 に答える
0

ユーザーごとに 1 つのイベントのみを想定すると、次のようになります。

SELECT
Userid
,MAX(CASE WHEN flag = 'START' THEN dt END) AS started
,MAX(CASE WHEN flag = 'END' THEN dt END) AS Ended
FROM
(
SELECT 1 as userid,            'START' as flag   ,    '17/06/2013 11:00' as dt FROM DUAL
UNION ALL SELECT 1,            'END' as flag    ,   '17/06/2013 11:05' As dt FROM DUAL
UNION ALL SELECT 2,            'START'     as flag , '16/06/2013 11:00' As dt FROM DUAL
UNION ALL SELECT 2,            'END'        as flag,  '16/06/2013 11:05' As dt FROM DUAL
) a
GROUP BY userid
于 2013-06-17T10:51:53.760 に答える
0

イベント コードの値が一貫しており、「開始」と「終了」の間で異なる場合は、テーブル自体を結合して、次のように結果をフィルター処理できます。

select t1.id as "User ID", t1."Event Timestamp" as "Start DateTime", t2."Event Timestamp" as "Start DateTime" 
from your_table t1, your_table t2 
where t1.id = t2.id and t1."Event Code" = 'START' and t2."Event Code" = 'END' 
于 2013-06-17T10:52:47.173 に答える