イベントが開始日と終了日が異なる行に格納される単一のテーブルがあります。今、レポートを作成するために、開始日と終了日の対応するすべてのペアを照会したいと思います。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
OUTERが適用になるかはわからないが、おそらく私はここにあなたのより良い選択となります何かあなたのために働いています。 – Matt