ホームページ >データベース >mysql チュートリアル >SQL で連続する日付範囲を効率的に検出して抽出する方法

SQL で連続する日付範囲を効率的に検出して抽出する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 01:58:41954ブラウズ

How to Efficiently Detect and Extract Consecutive Date Ranges in SQL?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。