2017-08-03 18 views
0

テーブルから1日の最大温度をそれぞれの日時情報と共に選択するのが難題です。groupwise maxが原因でsql_modeエラーが発生する

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

これは、SELECTリストの

式#1は、GROUP BY句ではなく、GROUP BY句の列に機能的に依存 ない 非凝集列「Weather.datestamp」を含有させます。これはsql_modeのと互換性 ある= ONLY_FULL_GROUP_BY

他の同様の質問には、JOINを使用して提案しているが、私は、高い温度の値が一意ではありませんので、私はJOIN構文を使用する方法を見ることができません。

+0

あなたはどのようにネクタイを扱いますか?だから同じ日に10のレコードがある場合、そのうちの4つのテンポラリが同じ場合は、4つの日付スタンプがすべて必要ですか?一つだけ? 1つあれば? – xQbert

答えて

1

RDBMSはセットベースのロジックに最も適しています。だから、二組の観点でデータを考える:

  • W2:時間
  • の期間、すべての測定値を含むデータの宇宙:特定の日
  • ワットのための最高の一時を含むデータセットを

これら2つのセットを結合することによって、与えられた日の最高温度を有するwからのデータだけを得ることができる。

ユニバースセット{w}全体に対してインラインビュー{w2}を使用することで、毎日の最高温度を生成し、基本セット{w}に再び加わり、毎日の最高温度の時間情報を取得できます。あなたが関係を処理する方法を示していないてきたように、最大​​温度は、あなたがそれらすべてをしたい、同じ日に複数のレコード上にある場合

  • これがあることを前提としています。

  • datestampには時間コンポーネントがあります。それは1日の最高温度を見たい日時です。

これは、の意味他の人が最も可能性の高い参加するものである:

  • 日付(日付スタンプ)は、単に日付/時刻の日付コンポーネントを返します。
  • 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 

ADDITIONAL INFO: 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にある必要がありますが、選択されていてgroup byではありません。 しかしtempの場合、集計関数MAXを使用しているので、GROUP BYにする必要はありません。 グループで日付スタンプを使用するか、SQLモードを変更してください。

正確な理由は、モードによってMySQLの完全なグループと

  • FROM mysqlの

    論理的な順序

    • 内の文の論理的なクエリ実行順序
    • GROUP BY
    • です
    • 総計
    • HAVING
    • SELECT

    したがって、SELECTの前にGROUPINGが実行されます。したがって、グループ全体を選択すると、SELECTはGROUPED列とAGGREGATED列だけにアクセスできます。

  • +0

    ステートメントの論理的な順序についてのあなたの説明は役に立ちます! – Levi

    +0

    @Leviありがとう –

    関連する問題