2017-08-03 53 views
0

挑戰是從表中選擇每日最高溫度以及每個日期和時間信息。groupwise max導致sql_mode錯誤

SELECT datestamp, max(temp) hitemp from Weather w group by `year`, `month`, `day`; 

這會導致選擇列表

表達#1不處於GROUP BY子句和包含 非聚集列「Weather.datestamp」,這是不 函數依賴於在GROUP BY子句中的列;這是 用的sql_mode不相容= only_full_group_by

其他類似的問題提出使用JOIN,但我看不到我如何使用JOIN語法,因爲高溫值不是唯一的。

+0

你想如何處理關係?所以如果一個datestamp在同一天有10個記錄,其中4個具有相同的tempature,你是否想要所有4個datestamps?只有一個?如果哪一個? – xQbert

回答

1

RDBMS在基於集合的邏輯上工作得最好。因此,認爲該數據的兩套術語:

  • W2:一組包含的最高溫度爲給定的一天
  • 數據的寬:包含一段時間
  • 所有測量數據的宇宙

通過加入這兩組數據,我們可以從w獲得具有給定日期的最高溫度的數據。

通過對整個宇宙集{w}使用內聯視圖{w2},我們可以生成每天最大溫度,然後返回基本集{w}以獲取每天最大溫度的時間信息。

這假定:

  • 如果最高溫度是在多個記錄在同一天,你希望它們都因爲你還沒有表示如何處理關係。
  • datestamp有一個時間組件;這是您想要在一天中查看最高溫度的日期/時間。

這是別人的意思加入最有可能的:

  • 日(郵戳)只是返回的日期/時間的日期部分。
  • MAX()返回由表示的基團的最高溫度(在郵戳的這種情況下,日期)

SELECT datestamp, Temp 
FROM weather W 
INNER JOIN (SELECT date(datestamp) mDate, max(temp) as mtemp 
      FROM weather 
      GROUP BY Date(DateStamp)) W2 
    on W.temp = W2.mtemp 
and Date(w.Datestamp) = w2.mDate 

附加信息: MySQL不支持它也可以用來解決這個問題有可能更高的性能cross apply也不分析功能row_number() Over (partition by date(datestamp) order by temp desc)。 SQL Server,Oracle,DB2,Postgresql都有不同的解決方法;然而上面的例子適用於所有RDBMS引擎(我能想到);但在所有情況下都不是最有效率的。

+0

感謝您的有組織和周到的迴應。識別這些假設尤其顯露出來。精美的作品! – Levi

1

您的sql模式已滿分組。這意味着select中的所有列必須位於Group By子句中 datestamp處於select中,但不在group by中。 但是對於temp,由於您使用的是聚合函數MAX,因此它不需要在GROUP BY中。 在group by中使用datestamp或更改您的sql模式。

的確切原因是模式mysql的整組和語句在MySQL

邏輯秩序

  • 邏輯查詢執行順序
  • WHERE
  • GROUP BY
  • AGGREGATIONS
  • HAVING
  • 選擇

因此,GROUPING在SELECT之前完成。因此,如果選擇完整分組,SELECT可以單獨訪問GROUPED和AGGREGATED列。

+0

您對陳述的邏輯順序的解釋很有幫助! – Levi

+0

謝謝@列維 –