ホームページ > データベース > mysql チュートリアル > SQL で特定の日付範囲内のレコードを効率的にカウントするにはどうすればよいですか?

SQL で特定の日付範囲内のレコードを効率的にカウントするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-18 16:42:11
オリジナル
740 人が閲覧しました

How to Efficiently Count Records Within a Specific Date Range in SQL?

2 つの日付間のレコードのカウント

多軸グラフを生成するには、指定された期間内の日付ごとに作成されたレコードの数が必要です日付範囲。

問題Statement

共通テーブル式 (CTE) を使用してクエリを作成しようとした最初の試みでは、「オペランド型の衝突: datetime2 は int と互換性がありません。」というエラーが発生しました。これは、日付範囲に使用される datetime2 データ型と日数のオフセットに予期される整数の不一致が原因で発生しました。

解決策

この問題に対処するには、集計テーブルまたは関数を使用すると、パフォーマンスが向上します。 Itzik Ben-Gan によって作成された、そのような集計テーブル関数の 1 つがここに示されています。

WITH
    L0 AS ( SELECT 1 AS c 
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ),
    L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ),
    Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
              FROM L2 )
ログイン後にコピー

この集計テーブルに基づいて、Date_Range_T CTE を作成できます。

Date_Range_T (d_range) AS (
      SELECT TOP(DATEDIFF(day, @StartDate, @EndDate) + 1)
          DATEADD(day, rownum - 1, @StartDate) AS d_range,
          DATEADD(day, rownum, @StartDate) AS d_rangeNext
      FROM Nums
    )
ログイン後にコピー

This Date_Range_T CTE は、@StartDate から @StartDate までの日付の範囲を提供します。 @EndDate.

各日付のレコード数を計算するには、クエリを次のように記述できます。

SELECT d_range, COUNT(Id) AS Total 
FROM Date_Range_T 
LEFT JOIN tbl_Support_Requests R
    ON R.CreatedDate >= T.d_range AND R.CreatedDate < T.d_rangeNext
GROUP BY d_range
ORDER BY d_range ASC
ログイン後にコピー

このクエリは、目的の結果、つまり各日付のレコード数を返します。指定された日付範囲内の日付。

以上がSQL で特定の日付範囲内のレコードを効率的にカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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