ホームページ >データベース >mysql チュートリアル >MySQL クエリの日付のギャップを埋めるにはどうすればよいですか?

MySQL クエリの日付のギャップを埋めるにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 21:37:45141ブラウズ

How to Fill Date Gaps in MySQL Queries?

MySQL の日付ギャップを埋める

MySQL で日付ベースのクエリを使用する場合、データにギャップがある状況が発生することがあります。特定の日付の場合。これは、データの包括的なビューを表示したい場合、または日付の完全なセットに依存する計算を実行したい場合に問題になる可能性があります。

日付ギャップのあるクエリ:

この問題を実証するには、次のクエリを考えてみましょう:

SELECT DATE(posted_at) AS date,
    COUNT(*) AS total,
    SUM(attitude = 'positive') AS positive,
    SUM(attitude = 'neutral') AS neutral,
    SUM(attitude = 'negative') AS negative
    FROM `messages`
    WHERE (`messages`.brand_id = 1)
    AND (`messages`.`spam` = 0
    AND `messages`.`duplicate` = 0
    AND `messages`.`ignore` = 0)
    GROUP BY date ORDER BY date

このクエリは、日付ごとにグループ化された結果を返し、合計数と態度を示します。各日付の合計。ただし、データのない日付がある場合、それらは結果に含まれず、データセットにギャップが生じます。

ギャップを埋める:

埋めるにはこれらのゼロとのギャップがある場合は、ヘルパー テーブルを利用して、開始日と終了日の間の完全な日付セットを生成できます。ヘルパー テーブルは、次のクエリを使用して作成できます。

SELECT date AS dt FROM (
    SELECT CURDATE() AS date
    UNION ALL
    SELECT date + INTERVAL 1 DAY FROM dates
    FROM dates
    WHERE date < DATE_ADD(CURDATE(), INTERVAL 1 YEAR)
) dates

このクエリは、1 年後に到達するまで、現在の日付に再帰的に 1 日を追加します。

Query withヘルパー テーブル:

これで、LEFT JOIN を使用してヘルパー テーブルをメイン クエリと結合し、日付を埋めることができます。ギャップ:

SELECT  d.dt AS date,
        COUNT(*) AS total,
        SUM(attitude = 'positive') AS positive,
        SUM(attitude = 'neutral') AS neutral,
        SUM(attitude = 'negative') AS negative
FROM    dates d
LEFT JOIN
        messages m
ON      m.posted_at >= d.dt
        AND m.posted_at < d.dt + INTERVAL 1 DAYS
        AND spam = 0
        AND duplicate = 0
        AND ignore = 0
GROUP BY
        d.dt
ORDER BY
        d.dt

このクエリは、データのない日付を含む日付の完全なセットを返し、ギャップをゼロで埋めます。

以上がMySQL クエリの日付のギャップを埋めるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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