2017-07-14 2 views
-1

mysql(MariaDB)のいくつかの車両の車両ログの一環として、1台のクエリで各車両に最大の走行距離を含む行を探す必要があります。 テーブルには、id、vehicle_id、km_start、km_endの列が含まれています。 これは、各vehicle_idに対してmax(max_start、km_end)を持つ行を見つけることです。WHEREでGREATESTを使用する

私はkm_endが常に存在している場合

SELECT id 
FROM log 
WHERE (vehicle_id,km_end) IN (SELECT vehicle_id, MAX(IFNULL(km_end,0)) 
           FROM log 
           GROUP BY vehicle_id) 

が仕事をすることがわかりました。しかし、km_endがまだ入力されていなければ、それは0を含むでしょう。したがって、最大走行距離はkm_startにあるかもしれません。

私は ERROR 1054(42S22)を返し

SELECT id 
FROM log 
WHERE (vehicle_id,km_max) IN (SELECT vehicle_id, 
            GREATEST(MAX(IFNULL(km_start,0)), 
               MAX(IFNULL(km_end,0))) AS km_max 
           FROM log GROUP BY vehicle_id) 

試してみました:WHEREでの値リストためだろう 'IN/ALL/ANYサブクエリ'

+0

参照します。https://メタ.stackoverflow.com/questions/333952/what-should-i-provide-an-mcve-for-what-to-me-to-be-a-very-simple-sql-query – Strawberry

答えて

0

不明な列 'km_max' をサブクエリの外側にあるフィールドは、logのフィールドを参照する必要があります。私は多分これ GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0)))GREATEST(IFNULL(MAX(km_start,0)), IFNULL(MAX(km_end,0)))を変更したい、また

SELECT id 
FROM log AS l 
INNER JOIN (
    SELECT vehicle_id 
     , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) AS km_max 
    FROM log 
    GROUP BY vehicle_id 
) AS lMax 
ON l.vehicle_id = lMax.vehicle_id 
AND lMax.km_max IN (l.km_start, l.km_end) 

;:あなたは代わりにJOINを使用することができるかもしれそれが完全に重要かどうかは分かりませんが直観的にはパフォーマンスが向上すると思います。 ほとんどの集約関数はNULLを無視し、NULL値のみが検出された場合のみnullを返します。あなたがヌルを心配する必要がある唯一の時間は、最大値が計算された後です。 (あなたは平均的な使用していたし、それはしかし別の問題だろう0のようヌルをカウントしたい場合。)


また、これは同様に動作可能性があります

WHERE (vehicle_id 
     , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) 
    ) IN (SELECT vehicle_id 
        , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) AS km_max 
      FROM log 
      GROUP BY vehicle_id 
      ) 
+0

ありがとう、ウエーエード。 あなたの最初の提案は魅力のように機能します。 MAXとIFNULLのスローを変更すると ERROR 1064(42000):SQL構文にエラーがあります。あなたのMariaDBサーバのバージョンに対応するマニュアルをチェックして、正しい構文を '0'の近くで使用する)、IFNULL(MAX(km_end、0)))AS km_max FROM log GROUP BY vehicle_id)AS lMax ON l 'on line 1 2番目の提案(代替...)スロー エラー1111(HY000):無効なグループ機能の使用 最初の提案を使用します。 –

+0

Re:IFNULLとMAXの入れ替え。 IFNULLの2番目の引数を_i.eと同様に移動する必要がありました。 IFNULL(MAX(x、0))_ではなく、IFNULL(MAX(x)、0) Re:2番目の提案。ああ、どこに集約することはできません。あなたはHAVINGを使うことができます(ただし、同じ文脈でGROUP BYのないHAVINGを使用する言語の濫用と考えられる人もいます)。 – Uueerdo

+0

IFNULL(MAX(x)、0) 0))。それは今働く。ありがとうございました。 –

関連する問題