0

SQLの問題:2つのテーブルに分割された開始日と終了日からのイベントのアクティブ期間を決定します

これは私が作成する必要のあるアドホックレポートです。イベント(csv)に関連する2つの抽出ファイルが提供されました。これらの抽出を単一のSQLテーブル#temp_eventsに挿入するつもりです。

ファイル1:

event, start date
Core training, 01Jan2011
Certification reviews, 23Feb2011
Core training, 15May2011
Abc Event, 24Nov2011

ファイル2:

event, end date
Core training, 05Jan2011
Certification reviews, 24Feb2011
Core training, 18May2011
Abc Event, 30Nov2011

#temp_eventsに挿入したいのですが、エントリはイベントのアクティブ期間を定義します。これが目前の主要な問題であるため、FKがないことに注意してください...データを関連付ける唯一の方法はイベント名を使用することですが、イベントが複数回発生する可能性があります。イベントの長さを定義するデータがないため、イベントの終了を計算できません。残念ながら、これらは抽出プロバイダーが規定しているように私が対処する必要のある制限です。

自然キー/ID/ FKがない場合でも、ファイル1のイベントをファイル2に確実にリンクできるように、コーディングする必要のあるロジックの提案を誰かが提供できますか?私が遭遇する可能性のある明らかな抜け穴はありますか?

4

1 に答える 1

2

そこに行きます:

CREATE TABLE eventstart
        ( event VARCHAR NOT NULL
        , zdate date
        );
INSERT INTO eventstart(event,zdate) VALUES
 ( 'Core training' , '2011-01-01' )
,( 'Certification reviews' , '2011-02-23' )
,( 'Core training' , '2011-05-15' )
,( 'Abc Event' , '2011-11-24' )
        ;


CREATE TABLE eventend
        ( event VARCHAR NOT NULL
        , zdate date
        );
INSERT INTO eventend(event,zdate) VALUES
 ('Core training' , '2011-01-05' )
,('Certification reviews' , '2011-02-24' )
,('Core training' , '2011-05-18' )
,('Abc Event' , '2011-11-30' )
        ;

WITH    s AS (
        SELECT ss.event, ss.zdate
        , ROW_NUMBER() OVER( PARTITION BY ss.event ORDER BY ss.zdate) AS zrnk
        FROM eventstart ss
        )
        ,e AS (
        SELECT ee.event, ee.zdate
        , ROW_NUMBER() OVER( PARTITION BY ee.event ORDER BY ee.zdate) AS zrnk
        FROM eventend ee
        )
SELECT s.event
       , s.zdate AS sdate
       , e.zdate AS edate
FROM s
LEFT JOIN e ON e.event = s.event AND s.zrnk = e.zrnk
WHERE s.zdate <= COALESCE(e.zdate , s.zdate) -- safety valve ;-)
        ;

注:上記のクエリは非常に失礼です。これは、OPによって指定された境界条件に依存しており、すべての開始レコードに一致する終了レコードが存在します。そうでない場合:YMMV

結果:

CREATE TABLE
INSERT 0 4
CREATE TABLE
INSERT 0 4
         event         |   sdate    |   edate    
-----------------------+------------+------------
 Abc Event             | 2011-11-24 | 2011-11-30
 Certification reviews | 2011-02-23 | 2011-02-24
 Core training         | 2011-01-01 | 2011-01-05
 Core training         | 2011-05-15 | 2011-05-18
(4 rows)
于 2013-01-20T11:58:41.320 に答える