ホームページ  >  に質問  >  本文

mysql - 如何写一条SQL,分时段统计结果?

比如时间是过去24小时,将这过去24小时分成10等分,一条SQL查询出10条记录,也就是每个时间段的统计结果。
一条SQL可以实现上述的需求吗?谢谢:-)

我想到一种办法,将这10条SQL用union拼接起来,请问一下还有其他的办法吗?

我的SQL是:

select sum(num) from T where time >= xx and time <= yy;

现在是要将[xx, yy]时间分成10等分,返回各个时间段的统计结果

PHP中文网PHP中文网2742日前645

全員に返信(6)返信します

  • 天蓬老师

    天蓬老师2017-04-17 16:45:41

    ケースごとに 1 つの SQL

    • あなたのニーズに合わせて case when を使用することはできないでしょうか? SQL 1 つで完了します。 ! ! !

    リーリー

    メンテナンスの改善

    • 時間の減算に注意してください。存储过程 を使用して上記の SQL をカプセル化し、startTimeendTime、等分数の 3 つのパラメーターを受け取り、次の合計の開始値を計算することをお勧めします。各間隔の終了時刻 (私の SQL では、front-close と then-open が使用されていることに注意してください。ただし、最後の等分は終了時刻と等しくなければなりません。そうしないと、endTime に等しい値が失われ、カウントされません。 ) 次に、値を SQL に渡して実行します。この方法では、呼び出しごとに呼び出す必要があるストアド プロシージャは 1 つだけです

    本当にこれを行う必要がありますか?

    実際のところ、お客様の具体的なビジネスシナリオはわかりませんが、状況に応じて選択させていただきます

    • startTimeendTime の間で見つかったデータが大きくない場合、またはデータベース内の総量が大きくない場合は、@Paul_Ding が 2 階で言ったことを提案します。

    • ただし、データベース内のレコードが非常に大きい場合、または startTimeendTime に基づいて数十万のレコードを頻繁に検索する場合は、SQL を使用して、毎回それほど多くのレコードを読み取る必要はありません。レコードは処理のためにネットワーク経由でコードに送信されます。ただし、単純なプログラミングと計算が必要なこの種の SQL の場合は、より効率的にそれを 存储过程 にカプセル化することをお勧めします。メンテナンス

    • 上記の 2 つの方法に関係なく、実際には、より複雑なコードまたはより複雑な SQL を使用して問題を解決するだけですが、適切な方法を選択する必要があります。独自のビジネスシナリオに応じて。 复杂度

    • 返事
      0
  • 天蓬老师

    天蓬老师2017-04-17 16:45:41

    等時間関数でグループ化するだけです

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:45:41

    24 時間のデータをチェックアウトした後に分割することをお勧めします。これによりコストが削減され、そのような作業を行うために SQL を使用する必要がなくなります。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:45:41

    これは以前に行ったことです:
    1. この期間 [xx, yy] と等しい分数 N に基づいて、時間セグメント一時テーブル split_time_table
    id start_time<🎜 を作成します。 > 1 2017-01-12 00:00:00
    2 2017-01-12 02:24:00
    3 2017-01-12 04:48:00
    リーリー

    10 2017-01-12 21:36:00

    (この一時テーブルを作成するにはコツがあります。id の主キーを忘れずに作成してください)

    2. この一時テーブルを何に関連付けますか?テーブル T を確認したい場合 リーリー

    上記の 144 は、(yy-xx)/N によって計算されます。上記の例は、1 日 24 時間を 10 等分に基づいています。

    これは実践可能なメソッドであり、パラメータを渡すことで一部の変数を動的に計算できます。

    返事
    0
  • 迷茫

    迷茫2017-04-17 16:45:41

    フロアごとにグループ化(mod(time, 86400)/8640)

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 16:45:41

    Oracle の手法とアイデアについて話しましょう。この要件の難しい点は、ケースを使用する場合でも、開始時刻 + 等しい期間 1、開始時刻 + 等しい期間 2、開始時刻 + が必要であることです。等時間セグメント *3...
    Oracle の レベル クエリ を使用すると、何もないところから 1、2、3...10 を作成できます。コードは次のとおりです。
    リーリー

    引用情報

    取得した数値を再利用し、期間(間隔)を掛けて事前に計算しておきます
    リーリー

    返事
    0
  • キャンセル返事