sql >> データベース >  >> RDS >> Mysql

30日のビンの行数を数える

    ストアドプロシージャ、一時テーブルはなく、クエリは1つだけで、日付列にインデックスが指定された効率的な実行プラン:

    select
    
      subdate(
        '2012-12-31',
        floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 + 30 - 1
      ) as "period starting",
    
      subdate(
        '2012-12-31',
        floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30
      ) as "period ending",
    
      count(*)
    
    from
      YOURTABLE
    group by floor(dateDiff('2012-12-31', dateStampColumn) / 30);
    

    この呪文を除いて、ここで何が起こっているのかはかなり明白なはずです:

    floor(dateDiff('2012-12-31', dateStampColumn) / 30)
    

    その式は数回出現し、30日前のdateStampColumnの数に評価されます。 は。 dateDiff 差を日数で返し、30で割って、30日の期間で取得し、すべてをfloor()にフィードします。 整数に丸めます。この番号を取得したら、GROUP BYできます さらに、この数値を期間の開始日と終了日に変換するために、少し計算を行います。

    '2012-12-31'を置き換えます now()を使用 必要に応じて。サンプルデータは次のとおりです。

    CREATE TABLE YOURTABLE
        (`Id` int, `dateStampColumn` datetime);
    
    INSERT INTO YOURTABLE
        (`Id`, `dateStampColumn`)
    VALUES
        (1, '2012-10-15 02:00:00'),
        (1, '2012-10-17 02:00:00'),
        (1, '2012-10-30 02:00:00'),
        (1, '2012-10-31 02:00:00'),
        (1, '2012-11-01 02:00:00'),
        (1, '2012-11-02 02:00:00'),
        (1, '2012-11-18 02:00:00'),
        (1, '2012-11-19 02:00:00'),
        (1, '2012-11-21 02:00:00'),
        (1, '2012-11-25 02:00:00'),
        (1, '2012-11-25 02:00:00'),
        (1, '2012-11-26 02:00:00'),
        (1, '2012-11-26 02:00:00'),
        (1, '2012-11-24 02:00:00'),
        (1, '2012-11-23 02:00:00'),
        (1, '2012-11-28 02:00:00'),
        (1, '2012-11-29 02:00:00'),
        (1, '2012-11-30 02:00:00'),
        (1, '2012-12-01 02:00:00'),
        (1, '2012-12-02 02:00:00'),
        (1, '2012-12-15 02:00:00'),
        (1, '2012-12-17 02:00:00'),
        (1, '2012-12-18 02:00:00'),
        (1, '2012-12-19 02:00:00'),
        (1, '2012-12-21 02:00:00'),
        (1, '2012-12-25 02:00:00'),
        (1, '2012-12-25 02:00:00'),
        (1, '2012-12-26 02:00:00'),
        (1, '2012-12-26 02:00:00'),
        (1, '2012-12-24 02:00:00'),
        (1, '2012-12-23 02:00:00'),
        (1, '2012-12-31 02:00:00'),
        (1, '2012-12-30 02:00:00'),
        (1, '2012-12-28 02:00:00'),
        (1, '2012-12-28 02:00:00'),
        (1, '2012-12-30 02:00:00');
    

    そしてその結果:

    period starting     period ending   count(*)
    2012-12-02          2012-12-31      17
    2012-11-02          2012-12-01      14
    2012-10-03          2012-11-01      5
    

    期間のエンドポイントは包括的です。

    SQLFiddle でこれを試してみてください 。

    一致する行がゼロの30日間は結果に含まれないという点で、少し間抜けな可能性があります。期間のテーブルに対してこれを結合できれば、それを排除できます。ただし、MySQLにはPostgreSQLの generate_series() 、したがって、アプリケーションでそれを処理するか、を試す必要がありますこの巧妙なハック



    1. jquerydatatableを使用してページングの並べ替えと検索を追加する

    2. Javaプログラムで呼び出すJavaストアドプロシージャ

    3. SQLiteクエリ結果からINSERTステートメントを生成する

    4. MySQLは単語に$を含む正確な単語を検索します