MySQL スライディングオーダー問題の原理と解決の例分析

MySQL スライディングオーダー問題の原理と解決の例分析

この記事では、例を使用して、MySQL スライディング順序問題の原理と解決方法を説明します。ご参考までに、詳細は以下の通りです。

まず、MonthlyOrdersテーブルを作成し、次のコードに従ってデータをインポートします。

テーブル MonthlyOrders を作成します(
注文月 DATE、
順序番号 INT UNSIGNED,
主キー (ordermonth)
);

MonthlyOrders に INSERT INTO SELECT '2010-02-01',23; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-03-01',26; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-04-01',24; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-05-01',27; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-06-01',26; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-07-01',32; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-08-01',34; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-09-01',30; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-10-01',31; を追加します。
MonthlyOrders に INSERT INTO SELECT '2010-11-01',32; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2010-12-01',33; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-01-01',31; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-02-01',34; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-03-01',34; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-04-01',38; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-05-01',39; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-06-01',35; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-07-01',49; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-08-01',56; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-09-01',55; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-10-01',74; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-11-01',75; を挿入します。
MonthlyOrders に INSERT INTO SELECT '2011-12-01',14; を挿入します。

スライディングオーダー問題とは、前年度(四半期または月)の各月のスライディングオーダー数を返すこと、つまり、各 N 月について、N-11 から N 月までのオーダーの合計数を返すことを指します。ここでは、月の順序にギャップがないものと想定します。

次のSQLクエリを実行して、前年の各月のスライディングオーダーの合計数を返します。

選択
  DATE_FORMAT(a.ordermonth, '%Y%m') AS frommonth,
  DATE_FORMAT(b.ordermonth, '%Y%m') AS tomonth,
  SUM(c.ordernum) AS 注文
毎月の注文から
INNER JOIN 毎月の注文 b
  ON DATE_ADD(a.ordermonth, INTERVAL 11 MONTH) = b.ordermonth
INNER JOIN 毎月の注文 c
  c.ordermonth で、a.ordermonth と b.ordermonth の間
GROUP BY a.ordermonth、b.ordermonth;

実行結果は次のとおりです

クエリは最初に MonthlyOrders テーブルで自己結合を実行します。表 a は下限 (frommonth) として使用され、表 b は上限 (tomonth) として使用されます。接続の条件は次のとおりです。

DATE_ADD(a.ordermonth, INTERVAL 11 MONTH) = b.ordermonth

たとえば、表 a の 2010 年 2 月は 2011 年 1 月と一致します。

自己接続が完了したら、注文をカウントする必要があります。この時点で、範囲内の各月の注文数を取得するには、別の自己結合を実行する必要があります。接続の条件は

c.ordermonth は a.ordermonth と b.ordermonth の間です

上記の方法に基づいて、四半期ごとの受注状況を集計し、前年比の成長と比較するための基準として使用することもできます。

選択
  DATE_FORMAT(a.ordermonth, '%Y%m') AS frommonth,
  DATE_FORMAT(b.ordermonth, '%Y%m') AS tomonth,
  SUM(c.ordernum) AS 注文
毎月の注文から
INNER JOIN 毎月の注文 b
  ON DATE_ADD(a.ordermonth, INTERVAL 2 MONTH) = b.ordermonth
  AND MONTH(a.ordermonth) % 3 = 1
INNER JOIN 毎月の注文 c
  c.ordermonth で、a.ordermonth と b.ordermonth の間
GROUP BY a.ordermonth、b.ordermonth;

実行結果は次のとおりです

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQLでよく使われる集計関数の詳細な説明
  • MySql の集計関数に条件式を追加する方法
  • php+mysql オープンソース XNA 集計プログラムがダウンロード用にリリースされました
  • Mysql は非集計列を選択できません
  • MySQL クエリのソートとクエリ集計関数の使用法の分析
  • MySQL の単一テーブル クエリ操作例の詳細な説明 [構文、制約、グループ化、集計、フィルタリング、並べ替えなど]
  • MySQL 継続的集計の原理と使用法の分析
  • MySQLプロセス関数の一般的な使用例の分析
  • MySQLの累積集計原理と使用例の分析

<<:  CentOS8 - bash: 文字化けとその解決方法

>>:  jQueryはHTML要素の非表示と表示を実装します

推薦する

XHTML の珍しいが便利なタグ

Xhtml には、あまり使用されないが非常に便利なタグが多数あります。半分の労力で 2 倍の結果を達...

IDEA が MySQL データベースに接続できない問題の 6 つの解決策

この記事では、IDEA が MySQL データベースに接続できない問題に対する 6 つの解決策を主に...

小さなアイコンのフロントエンド処理ソリューションのグラフィカルな説明

序文この記事を始める前に、複数選択の質問をしてみましょう。フロントエンド開発でビルド ツールを使用す...

JavaScript を使用してテーブル情報を追加および削除する

JavaScript 入門JavaScript は軽量なインタープリタ型の Web 開発言語です。言...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...

Nginx インストール エラーの解決方法

1. nginx-1.8.1.tar.gzを解凍する2. fastdfs-nginx-module-...

使用場所によって混乱しやすいXHTMLタグ

<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...

CSS フロート(float, clear)の人気の解説と体験談

私はかなり昔に CSS に触れましたが、フローティングについてはいつも混乱していました。私の理解が浅...

DockerでNginxサーバーを作成する方法

動作環境: MAC Docker バージョン: Docker version 17.12.0-ce,...

Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します

序文最近 Linux を学び、その後 Win から Ubuntu に変更しました。以前インストールし...

Navicat は CSV データを MySQL にインポートします

この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...

LinuxサーバーにVueプロジェクトをデプロイする

ケース1 vue-cliはvue3プロジェクトをビルドし、プロジェクトをLinuxサーバーにアップロ...

CentOS での Docker の詳細なインストール チュートリアル

DockerにはCEとEEがあり、CE版はコミュニティ版(無料)、EE版はセキュリティを重視したエン...

iframe パラメータの説明と例

<iframe src=”test.jsp” width=”100″ height=”50″ ...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...