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

推薦する

2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い

ヒント: MySQL では、ユーザーの作成と削除が頻繁に必要になります。ユーザーを作成するときは、通...

VMware vSAN 入門概要

1. 背景1. vSphere の共有ストレージの背景を簡単に紹介するvSphere の重要な機能は...

CentOS 7.4 にソースコードから MySQL 8.0 をインストールするための詳細なチュートリアル

目次1. 環境2. 準備3. MySQL 8.0.11をインストールするMySQL 8 の公式バージ...

Vueでaxiosをカプセル化する方法

目次1. インストール1. はじめに3. インターフェースルートアドレス4. 使用例4.1 ダウンロ...

ボタンのタイプが送信として指定されていません。ボタンをクリックしても、指定された URL にジャンプしません。

現在、プロジェクトの要件により、フォームの送信を制御し、送信前にデータを検証および処理するために j...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

CSS 動的読み込みバー効果のサンプルコード

CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...

MySQLデータ復旧のさまざまな方法の概要

目次1. はじめに2. 直接回復2.1 mysqldumpバックアップの完全リカバリ2.2 xtra...

Nginx がサーバーの生存状態をパッシブにチェックする詳細な説明

導入定期的にヘルスチェックを送信して、アップストリーム グループ内の HTTP サーバーのヘルスを監...

KTLツールはMySQLからMySQLへのデータの同期方法を実現します

ktl ツールを使用して、mysql から mysql にデータを同期します。 1. 新しいジョブス...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

Tomcat の maxPostSize 設定に関する問題と注意事項

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

MySQL 5.7.13 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事では、参考までにMySQL 5.7.13 winx64のインストールと設定方法のグラフィック...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

MySQL 分離列とプレフィックスインデックスの使用の概要

目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...