2016-06-16 6 views
0

イベントが開始日と終了日が異なる行に格納される単一のテーブルがあります。今、レポートを作成するために、開始日と終了日の対応するすべてのペアを照会したいと思います。1つのテーブル内のイベントの開始日と終了日の検索

CREATE TABLE EVENTS (
Id INT IDENTITY(1,1) PRIMARY KEY, 
DateEntry datetime, 
IsStart bit, 
EventType varchar(12) 
) 

INSERT INTO EVENTS 
VALUES 
('2016-06-16', 1, 'EVENT A'), 
('2016-06-16', 1, 'EVENT B'), 
('2016-06-17', 0, 'EVENT A'), 
('2016-06-18', 1, 'EVENT A'), 
('2016-06-19', 0, 'EVENT A'), 
('2016-06-20', 0, 'EVENT B'), 
('2016-06-21', 1, 'EVENT C') 


SELECT EventType, DateEntry as StartDate, EndDate = LEAD(DateEntry, 1) OVER (PARTITION BY EventType ORDER BY DateEntry) 
FROM Events 
ORDER BY EventType, DateEntry 

このクエリを返す:

| EventType | StartDate | EndDate | 
======================================= 
| EVENT A | 2016-06-16 | 2016-06-17 | 
| EVENT A | 2016-06-18 | 2016-06-19 | 
| EVENT B | 2016-06-16 | 2016-06-20 | 
| EVENT C | 2016-06-21 | NULL  | 

は、私が唯一の開始日を探しにフィルタを追加し、その上にLEAD関数を適用する必要があります。

| EventType | StartDate | EndDate | 
======================================= 
| EVENT A | 2016-06-16 | 2016-06-17 | 
| EVENT A | 2016-06-17 | 2016-06-18 | 
| EVENT A | 2016-06-18 | 2016-06-19 | 
| EVENT A | 2016-06-19 | NULL  | 
| EVENT B | 2016-06-16 | 2016-06-20 | 
| EVENT B | 2016-06-20 | NULL  | 
| EVENT C | 2016-06-21 | NULL  | 

私はこの結果を期待していますWHERE句を追加すると、すべてのEndDateを完全に無視します。インラインクエリで

私は正しい結果を得ることができるが、私はこれが最善の解決策

SELECT * FROM (
SELECT EventType, IsStart, DateEntry as StartDate, EndDate = LAG(DateEntry, 1) OVER (PARTITION BY EventType ORDER BY DateEntry DESC) 
FROM Events) a 
WHERE IsStart = 1 
+0

OUTERが適用になるかはわからないが、おそらく私はここにあなたのより良い選択となります何かあなたのために働いています。 – Matt

答えて

1
SELECT * 
FROM 
    #EVENTS s 
    OUTER APPLY (
     SELECT TOP 1 DateEntry AS EndDateEntry 
     FROM 
      #EVENTS i 
     WHERE 
      i.EventType = s.EventType 
      AND i.IsStart = 0 
      AND i.DateEntry > s.DateEntry 
     ORDER BY 
      i.DateEntry ASC 
    ) e 
WHERE 
    s.IsStart = 1 
+0

ありがとう、私は期待される結果を得る、明日このソリューションをより多くのテストデータで検証する。それから私は受け入れます – dwonisch

関連する問題