重複の可能性:
SQL: 最長の日付ギャップを見つける
以下の構造のテーブルがあります。
| LearnerId | FirstName | LastName | EnrollmentDate | CompletionDate |
SQLクエリを使用して、学校が学習者を登録または完了せずに行った最長期間を取得する必要があります。どうすればいいですか?
重複の可能性:
SQL: 最長の日付ギャップを見つける
以下の構造のテーブルがあります。
| LearnerId | FirstName | LastName | EnrollmentDate | CompletionDate |
SQLクエリを使用して、学校が学習者を登録または完了せずに行った最長期間を取得する必要があります。どうすればいいですか?
CTE とROW_NUMBER()
.
まず、日付の順序付きリストが必要です。つまり、2 つの列ではなく 1 つの列です。次に、ある日付をすぐ次の日付と非常に簡単に比較できます。
2 つの列にデータがあるため、この 1 つの順序付きリストを作成すると、比較的コストがかかります。膨大な量のデータを持っていないことを願っています。
WITH
all_dates
AS
(
SELECT EnrolmentDate AS event_date FROM yourTable GROUP BY EnrolmentDate
UNION
SELECT CompletionDate AS event_date FROM yourTable GROUP BY CompletionDate
)
,
sequenced_dates
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY event_date) AS id,
event_date
FROM
all_dates
)
SELECT
MAX(DATEDIFF(DAY, first_event.event_date, second_event.event_date)) AS duration
FROM
sequenced_dates AS first_event
INNER JOIN
sequenced_dates AS second_event
ON first_event.id = second_event.id - 1