MySQL累積計算実装方法の詳しい説明

MySQL累積計算実装方法の詳しい説明

この記事では、MySQL の累積計算の例について説明します。ご参考までに、詳細は以下の通りです。

序文

リクエストを受け、製品側はユーザーの成長曲線を分析したいと考えていました。つまり、一定期間内の1日あたりの総人数のリストです。最近の活動の有効性を評価することをお勧めします。この統計 SQL にはまだ時間がかかりました。 MySQL 統計には依然として特定のスキルが必要です。

需要分析

ユーザーID登録時間
1 2019-09-03
2 2019-09-04
3 2019-09-04
4 2019-09-05
5 2019-09-05
6 2019-09-06

上記の user_info テーブルを見ると、時間ディメンションに基づいて毎日追加された新規ユーザーの数を簡単にカウントできます。 SQL は次のとおりです。

reg_time、count(user_id)、daily_quantity を選択
 user_infoより
reg_time でグループ化 

上記の SQL を使用すると、次のリストを簡単に取得できます。

登録時間1日の数量
2019-09-03 1
2019-09-04 2
2019-09-05 2
2019-09-06 1

しかし、これは私たちが望んでいる結果ではありません。必要なのは、前日の合計と今日の純増加などです。つまり、私たちが望むのは:

登録時間1日の数量
2019-09-03 1
2019-09-04 3
2019-09-05 5
2019-09-06 6

これは少し難しいので、累積計算を行う必要があります。自己リンク、関数、その他の操作を試しましたが、正しい結果が得られませんでした。この時点では、これを処理するために Java コードを使用すれば完璧であるように思えます。初期値を宣言し、ループして累積して結果を計算する必要があるだけです。


 パブリック静的voidメイン(String[] args) {
  int[] arr = {1, 2, 2, 1};

  int[] ints = dailyQuantityArr(0, arr);


  (int i : ints) の場合 {
   System.out.println("i = " + i);
  }


 }


 パブリック静的int[] dailyQuantityArr(intベース、int[] dailyIncrQuantity) {


  int[] 結果 = 新しい int[dailyIncrQuantity.length];
  // 充填を累積する for (int i = 0; i < dailyIncrQuantity.length; i++) {
   ベース += dailyIncrQuantity[i];

   結果[i] = ベース;

  }
  結果を返します。
 }

上記の疑似コードで結果を計算できます。もちろん、可能であれば、この複雑な計算を Java ビジネス コードで実行してみてください。ただし、製品の要件は、ビジュアル データ エンジンで必要な回答を直接取得できる SQL ステートメントを提供できることです。そこで私は上記のコードからインスピレーションを得ました。
mysql にはそのような変数がありますか? 持っている!もちろん。非常によくあるシナリオを覚えています。過去には、シリアル番号を出力する必要があるビジネスがよくありました。Oracle には疑似列 rownum が付属していますが、MySQL にはありません。 MySQL は通常、自動インクリメント変数を宣言してシリアル番号を生成します。例として、user_info テーブルを見てみましょう。

行番号、ユーザーIDとして (@i:=@i+1) を選択 
 user_info から、(@i:=0 を選択) を r として

MySQL ユーザー変数

MySQL 変数は、ローカル変数、ユーザー変数、セッション変数、およびグローバル変数に分けられます。上記のステートメントでは、ユーザー変数を使用します。ユーザー変数はデータベース接続に関連しています。接続で宣言された変数は、ストアド プロシージャで作成された後、データベース インスタンスが切断されるまで消えます。この接続で宣言された変数は別の接続では使用できません。
MySQL のユーザー変数は事前に宣言する必要はなく、使用時に @varname の形式で宣言されます。代入演算は:=または=を通じて実行されます。外部に出力する必要がある場合は、 selectキーワードを使用し、割り当てに:=使用する必要があります。

累積計算にMysqlユーザー変数を使用する

ユーザー変数について学習した後、累積計算を実行する方法がわかりました。user_info テーブル内の毎日の累積合計人数は次のようになります。

 
 a.reg_timeを選択し、
    毎日、
   @i:=@i+a.daily を daily_quantity として 
  から(reg_timeを選択、  
  count(user_id) 日次 
  ユーザーグループから reg_time ) a 、
  (@i:=0 を選択) b

クエリ結果は以下のとおりで、論理要件を満たしています。

登録時間毎日1日の数量
2019-09-03 1 1
2019-09-04 2 3
2019-09-05 2 5
2019-09-06 1 6

しかし、ここにはちょっとした落とし穴があります。実際の業務では、初期化時に@iが0にならない場合があります。例えば、9月4日から9月6日までの合計人数は1人です。 これに特に注意してください。実際の業務開発においては、論理コーディングで実装できる場合は、複雑な操作を論理コーディングで実行することが推奨されます。

要約する

今日は、MySQL ユーザー変数を使用して SQL の累積計算の問題を解決しました。他に何か良いアイデアはありますか?ディスカッションのためにメッセージを残してください。

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

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

以下もご興味があるかもしれません:
  • mysql 時間差計算関数
  • MySQL で誕生日から年齢を計算する複数の方法
  • PHP と MySql で時間差を計算する方法
  • MySQL 文字列長計算実装コード (gb2312+utf8)
  • MySQLデータベースのQPSとTPSの意味と計算方法
  • MySQL の重要なパフォーマンス インデックスの計算と最適化方法の概要
  • mysqlのkey_lenの計算方法についての簡単な説明
  • MySQLクエリプランでken_lenの値を計算する方法
  • MySQLの日付と時刻の間隔計算の分析例
  • MySQLの日付加算と減算関数の詳細な説明
  • mysql トリガーの作成と使用例
  • MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明

<<:  Tomcat が IDEA のコンソールで文字化けを起こし、IDEA エンコーディングを UTF-8 に設定する方法

>>:  jsを使用してシンプルな虫眼鏡効果を実現します

推薦する

Dockerデーモンのセキュリティ設定項目の詳細な説明

目次1. テスト環境1.1 CentOS 7をインストールする1.2 Docker CE 19.03...

CSS でリスト スタイル属性を設定する方法 (この記事を読むだけ)

リストスタイルのプロパティHTMLには、順序なしリストと順序ありリストの2種類のリストがあります。仕...

MySQL における冗長インデックスと重複インデックスの違い

MySQL では、1 つの列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、M...

MYSQLデータベースの最適化段階を簡単に理解する

導入面接官がこんな質問をしたことはありませんか?データベースをどのように最適化しますか?では、この質...

docker ストレージを使用して Exit を実行すると、サーバーへのファイルのアップロードが失敗する問題と解決策

1. 問題の説明Docker コンテナにインストールされているストレージが終了状態になっているため、...

親要素に対する CSS 子要素の配置の実装

解決親要素に position:relative を追加します。子要素に position:abso...

ボタンに醜い灰色の枠線が付いています。これを削除するにはどうすればよいですか?

ダイアログをクロージャで使用し、右上隅の向こう側に閉じるボタンがあるダイアログを描画しました。ボタン...

Docker で MySQL をデプロイする詳細なプロセス (Docker でデプロイされる一般的なアプリケーション)

以前にも紹介しました: docker (一般的なアプリケーションのデプロイ): docker dep...

CSS でデフォルトのスタイルをクリアし、共通のスタイルを設定する方法

CSS デフォルトスタイルをクリア通常の明確なデフォルト スタイル: *{ マージン:0; パディン...

LeetCode の SQL 実装 (175. 2 つのテーブルの結合)

[LeetCode] 175.2つのテーブルを結合する表: 人物+-------------+--...

テーブルの幅を固定して、テキストによって幅が変わらないように設定

ページ内のテーブルの幅を width="600px" に設定した後も、幅が固定さ...

Dockerイメージの作成、保存、読み込み方法

イメージを作成する方法は 3 つあります。既存のイメージに基づいてコンテナを作成する、ローカル テン...

さまざまなブラウザに対応するためにCSSで指定フォント@font-faceを導入する際の問題

Web ページを作成するときに、特定のフォントを使用したい場合は、 @font-faceを介して参照...

大規模な Vue.js プロジェクトの構築と維持のための 10 のベスト プラクティス

目次1. スロットを使用してコンポーネントを理解しやすくし、より強力にする2. Vuexストアを正し...

MySQLのスイッチングデータ保存ディレクトリの実装方法

MySQLのスイッチングデータ保存ディレクトリの実装方法今日、仕事中に、mysql が保存されている...