ホームページ >データベース >mysql チュートリアル >SQL で連続する日付範囲を効率的に検出して抽出する方法
はじめに
さまざまなアプリケーションで、グループ化と抽出の必要性が頻繁に発生します。指定された入力からの連続した日付範囲。このタスクは、カレンダーの作成やデータ分析などの状況で発生します。 SQL の強力な機能を活用することで、複雑な結合や再帰的な CTE を必要とせずに問題を効率的に解決できます。
問題の定義
「InfoDate」という名前の列について考えてみましょう。以下に示すように、一連の日付が含まれています:
InfoDate |
---|
2013-12-04 |
2013-12-05 |
2013-12-06 |
2013-12-09 |
2013-12-10 |
2014-01-01 |
2014-01-02 |
2014-01-03 |
2014-01-06 |
2014-01-07 |
2014-01-29 |
2014-01-30 |
2014-01-31 |
2014-02-03 |
2014-02-04 |
目的は、連続する日付をそれぞれ識別することです。日付範囲を指定し、各間隔の開始日と終了日を抽出します。以下の例に示すように、連続する日付をグループ化して範囲を形成する必要があります。
StartDate | EndDate |
---|---|
2013-12-04 | 2013-12-06 |
2013-12-09 | 2013-12-10 |
2014-01-01 | 2014-01-03 |
2014-01-06 | 2014-01-07 |
2014-01-29 | 2014-01-31 |
2014-02-03 | 2014-02-04 |
SQL ソリューション
SQL を使用してこの結果を達成するには、行番号付けと日付の差分を組み合わせて使用する手法。 ROW_NUMBER() 関数を使用して、「InfoDate」列の各行に連続番号 (「i」) を割り当て、「d」という名前の列を作成します。この列は、各日付とそれに対応する行番号の差を表します。
WITH t AS ( SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i FROM @d GROUP BY InfoDate )
次の手順では、'i' 列と 'd' 列の差によって行をグループ化します (DATEDIFF(day,i, d))。このグループ化により、同じ差分値を共有するため、連続する日付を識別することができます。
SELECT MIN(d),MAX(d) FROM t GROUP BY DATEDIFF(day,i,d)
各グループ内で MIN() 関数と MAX() 関数を使用することで、日付の開始日と終了日を決定できます。
| StartDate | EndDate | |---|---| | 2013-12-04 | 2013-12-06 | | 2013-12-09 | 2013-12-10 | | 2014-01-01 | 2014-01-03 | | 2014-01-06 | 2014-01-07 | | 2014-01-29 | 2014-01-31 | | 2014-02-03 | 2014-02-04 |
このようにして、純粋に SQL ベースのアプローチを使用して、連続する日付範囲を効率的に抽出しました。
以上がSQL で連続する日付範囲を効率的に検出して抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。