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

特定の列を持つすべての行をカウントし、週ごとにグループ化

    クエリは非決定論的であるため、予期しない結果が得られるのは当然のことです。つまり、同じデータに対してこのクエリを5回実行し、5つの異なる結果セットを取得できるということです。これは、DATE(timestamp)を選択しているためです。 ただし、WEEK(DATE(startdate))によるグループ化 、したがって、クエリは、開始日ごとに出くわした最初の行の時刻を ANYで返します。 注文します。

    次の2行を検討してください(読みやすくするために日付形式のタイムスタンプ付き):

    TimeStamp       StartDate
    20120601        20120601
    20120701        20120601
    

    クエリはWEEK(StartDate)でグループ化されています これは23です。両方の行が同じ値に評価されるため、結果には2のカウントで1つの行が含まれると予想されます。

    ただし DATE(Timestamp) 選択リストにもあり、ORDER BYがないため ステートメントクエリは、「20120601」または「20120701」を返すタイムスタンプを認識していません。したがって、この小さな結果セットでも、50:50の確率で次のようになります。

    TimeStamp       COUNT
    20120601        2
    

    と50:50のチャンスを得る

    TimeStamp       COUNT
    20120701        2
    

    そのようにデータセットにデータを追加する場合:

    TimeStamp       StartDate
    20120601        20120601
    20120701        20120601
    20120701        20120701
    

    あなたは得ることができた

    TimeStamp       COUNT
    20120601        2
    20120701        1
    

    または

    TimeStamp       COUNT
    20120701        2
    20120701        1
    

    37,000,000行を使用すると、予期しない結果や予測できない結果がすぐに得られることがわかります。

    編集

    結果で週の開始を取得しようとしているように見えるので、週ごとにグループ化すると、次を使用して週の開始を取得できます(CURRENT_TIMESTAMPを任意の列に置き換えます):

    SELECT  DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
    

    次に、この日付でグループ化して、毎週の結果を取得し、グループ化されていないものを選択リストに含める手間を省くことができます。



    1. Mysql再帰ストアドプロシージャ...制限0に達しました...max_sp_recursion_depth変数を変更できません

    2. mySQL ::別のテーブルのデータをテーブルに挿入しますか?

    3. Oracle11GのINSERTSELECTステートメント

    4. Psycopg2は、小文字で始まるテーブル名を好みません