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

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

Susan Sarandon
リリース: 2024-12-23 06:21:22
オリジナル
635 人が閲覧しました

How to Fill Date Gaps in MySQL Aggregate Queries with Zeroes?

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

問題:

特定の日付の集計データを抽出するには、MySQL クエリが使用されます。ただし、返される結果セットにはデータのある日付のみが含まれ、日付の間にはデータのないギャップが残ります。目標は、これらのギャップをゼロで埋めて、連続した日付範囲を作成することです。

解決策:

これを実現するには、ヘルパー テーブルが必要です。このテーブルには、希望の開始日から希望の終了日までのすべての日付が含まれます。

CREATE TABLE dates (
  dt DATE NOT NULL,
  PRIMARY KEY (dt)
);
ログイン後にコピー

ヘルパー テーブルは、クエリを使用して設定できます:

INSERT INTO dates (dt)
SELECT DATE(posted_at)
FROM messages
WHERE brand_id = 1
AND spam = 0
AND duplicate = 0
AND ignore = 0
GROUP BY DATE(posted_at)
UNION
SELECT DATE('2023-01-01') + INTERVAL i-1 DAY
FROM (
  SELECT 1 AS i 
  UNION ALL
  SELECT i + 1 FROM <table> WHERE i < DATEDIFF('2023-12-31', '2023-01-01')
) AS i;
ログイン後にコピー

Replace '2023-01 -01」と「2023-12-31」に希望の開始日と終了日を入力します。

次に、ヘルパー テーブルは、元のクエリで 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート