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を使用してシンプルな虫眼鏡効果を実現します

推薦する

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

ウェブページの読み込み速度を上げる6つのヒント

第二に、キーワードのランキングは、Webページの表示速度にも関係しています(参照:キーワードランキン...

CentOS7 カーネル カーネル5.0 バージョンアップグレード

アップグレードプロセス:元のシステム: CentOS7.3 [root@my-e450 ~]# un...

VPSサーバーでよく使われるパフォーマンステストスクリプトの概要

これは、VPS サーバー用の一般的なワンクリック パフォーマンス テスト スクリプトです。マシンの構...

入力が完了したことを検出し、次のコンテンツを自動的に入力する HTML を実装する方法

前回の記事では、入力完了の簡単な検出を実現しましたが、今回はさらに一歩進んで、入力が完了した後に次の...

MySQL分離の使用手順を読む

現在のトランザクションはどの履歴バージョンを読み取ることができますか?読み取りビューは、トランザクシ...

Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明

目次vモデル.sync微妙な違い機能シナリオを要約します。 vモデル <!--親コンポーネント...

上下に空白行があるフォームを挿入する解決策

ウェブページを作成するときに、フォームを挿入した後、フォームの上下に空白行が表示されることがよくあり...

VMware pro15 インストール macOS10.13 詳細インストール図(画像とテキスト)

編集者は最近、macOS システムを使い始めたかったので、VMware に macOS イメージ シ...

デザイン視点技術はデザイン能力の重要な資本である

ある設計士はこう尋ねた。「実際のプロジェクト制作には参加せずに、純粋に設計だけをすることはできますか...

CSS アニメーション プロパティの使用方法とサンプル コード (transition/transform/animation)

開発中、優れたユーザー インターフェイスには常にいくつかのアニメーションが組み込まれます。 CSS ...

マージンの重複問題を解決する方法

1. まず、2つ以上の隣接する通常フローブロック要素の垂直マージンの崩壊を引き起こす原因を知る必要が...

Linux の netstat コマンドの詳細な紹介

目次1. はじめに2. 出力情報の説明3. netstatの共通パラメータ4. netstatネット...

mysql-5.7.21-winx64 無料インストール版のインストール - Windows チュートリアル詳細説明

1 ダウンロードアドレスは https://dev.mysql.com/downloads/mysq...