2011-09-13 6 views
2

このSQLを取得するのに問題があります。 iPadとstatlogテーブルの間には1対多の関係があり、最も価値の高い統計ログを選択したいと考えています。結合内でMAX関数を使用する

私の最初の解決策は、MAX-valueを取得したネストされたSELECTを含めることでしたが、lotという時間がかかりましたので、私はそれを書き直すことを余儀なくされました。

SELECT 
    ipad.udid, 
    ipad.state, 
    statelog.new_state 
FROM 
    ipad 
LEFT OUTER JOIN 
    statelog 
ON 
    ipad.udid = statelog.udid 
WHERE 
    ipad.airid=250033 
    AND 
    statelog.new_state = MAX(statelog.new_state) 

このSQLは機能しませんが、私の意図を示しています。

+0

どのようにクエリが機能しないのですか?エラーになりますか? – Shef

+0

MAX(statelog.new_state)は必要な特定のIDの最大値ではなくMAX値を取得します –

+0

ネストされた選択を使用するのが一般的ですが、 'statelog' 'new_state'なので、SWekoの答えはあなたのために働くはずです。 –

答えて

6

このような何かが

SELECT ipad.udid, ipad.state, max(statelog.new_state) 
FROM ipad 
    LEFT OUTER JOIN statelog ON ipad.udid = statelog.udid 
WHERE ipad.airid=250033 
GROUP BY ipad.udid, ipad.state 

MAXとSQL内の他の集計関数(分、合計、カウント、平均などを...)動作するには、値のグループに取り組んでいます。 結合はすべてのipadのすべての統計ログに対して1つの行を生成します。したがって、ipadが10個あり、それぞれ8個のstatelogを持つ場合は80個の行が得られます。 Group byは、すべてのipad(ipad.udidとipad.state列が同じ)に80行ずつグループ化され、そのグループの有効範囲ではmax(statelog.new_state)を使用して最大状態を抽出します。

+1

OPはstatelogのほかに何もしたくないので、この回答は正しいです! – Bohemian

+0

ありがとうございます。これにより、クエリ時間が50秒から0.3秒に変更されました。 – Burbas

関連する問題