2

特定のIDを持つ列を含む1日あたりのテーブルからすべての行をカウントし、UNIXタイムスタンプ列に基づいて週ごとの値にグループ化するクエリを作成するために、しばらくの間試みてきました。3,700 万行の中規模のデータセットがあり、次の種類のクエリを実行しようとしています。

SELECT DATE(timestamp), COUNT(*) FROM `table` WHERE ( date(timestamp) 
between "YYYY-MM-DD" and "YYYY-MM-DD" and column_group_id=X ) 
group by week(date(startdate)) 

私は奇妙な結果を得ていますが、クエリはカウントを正しくグループ化していませんが、結果のカウント列に大きすぎる値を示しています (非常に小さな特定のデータセットをクエリして、値のエラーを確認しました)。

代わりにグループ化date(startdate)すると、行数は 1 日単位で一致しますが、これらの 1 日あたりの行数を 1 週間あたりの量に結合したいと考えています。これはどのように可能でしょうか?データは次の形式で必要です。

2006-01-01 | 5 
2006-01-08 | 10

日のタイムスタンプが最初の列で、2 番目が 1 週間あたりの行数になります。

4

2 に答える 2

1

クエリは非決定論的であるため、予期しない結果が得られても驚くことではありません。これは、同じデータに対してこのクエリを 5 回実行し、5 つの異なる結果セットを取得できることを意味します。これは、選択しているDATE(timestamp)が でグループ化しているためです。WEEK(DATE(startdate))したがって、クエリは startdate 週ごとに最初の行の時間を任意の順序で返します。

次の 2 行を考えてみましょう (読みやすくするために日付形式のタイムスタンプを使用)。

TimeStamp       StartDate
20120601        20120601
20120701        20120601

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

HOWEVER 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

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

于 2012-06-14T15:48:44.083 に答える
0

これを試して

SELECT DATE(timestamp), COUNT(week(date(startdate))) FROM `table` WHERE ( date(timestamp) 
between "YYYY-MM-DD" and "YYYY-MM-DD" and column_group_id=X ) 
group by week(date(startdate)) 
于 2012-06-14T15:43:54.710 に答える