簡體   English   中英

計算具有特定列的所有行並按周分組

[英]Counting all rows with specific columns and grouping by week

我一直在嘗試一段時間,以創建一個查詢,該查詢將每天對表中的所有行進行計數,其中包括具有特定ID的列,然后根據UNIX timestamp列將它們分組為每周值。 我有一個具有3700萬行的中型數據集,並且一直在嘗試運行以下類型的查詢:

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)分組,則行計數每天匹配,但是我想將這些每日行數與每周行數相結合。 這怎么可能? 數據需要采用以下格式:

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

因此,時間戳記是第一列,第二列是每周的行數。

您的查詢是不確定的,因此獲得意外結果也就不足為奇了。 我的意思是,您可以對同一數據運行此查詢5次,並獲得5個不同的結果集。 這是由於您選擇了DATE(timestamp)但按WEEK(DATE(startdate))分組的事實,因此查詢以ANY順序返回每個開始日期周的第一行時間。

考慮以下兩行(為便於閱讀,帶有日期格式的時間戳記):

TimeStamp       StartDate
20120601        20120601
20120701        20120601

您的查詢將按23的WEEK(StartDate)分組,因為兩行的計算結果相同,因此您希望結果有1行且計數為2。

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

然后,您也可以按此日期分組,以獲取每周結果,並避免將不在列表中的內容放入選擇列表的麻煩。

嘗試這個

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)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM