2011-06-22 7 views
0

最大レコードを取得するためにmaxを使用する方がよいでしょうか? 以下のクエリで密度の高いランクとパーティションを再生しています。 しかし、私は望ましくない結果とパフォーマンスの低下に苦しんでいます。密なランクの最大レコード

select Tdate = (Select max(Date) 
        from Industries 
        where Industries.id = i.id 
         and Industries.Date <= '22 June 2011') 
    from #ii_t i 

多くのありがとう。

答えて

0

お使いのデータベースはどれですか?あなたがOracle上にいる場合は、最大値を探すループを持つpl/sqlを少し書くことができます(これはあまり効果がありませんが、可能です)。これを行うためのクエリを作成する場合は、分析関数を使用して再生する必要があります。

+0

私はSQL Serverを使用しています。 – jwe330

1

提供されたクエリでは、ウィンドウ機能がDENSE_RANKではありません。あなたのデータ構造に精通しているわけではありませんが、私はあなたのクエリが各産業IDのDateの最大値を見つけることを試みていると思います、はい?ランキング関数を使用するために上記のクエリを書き直すと、私はそれを共通のテーブル式として記述します。

; 
WITH RANKED AS 
(
    SELECT 
     II.* 
    -- RANK would serve just as well in this scenario 
    , DENSE_RANK() OVER (PARTITION BY II.id ORDER BY II.Date desc) AS most_recent 
    FROM Industries II 
    WHERE 
     II.Date <= '22 June 2011' 
) 
, MOST_RECENT AS 
(
    -- This query restricts it to the most recent row by id 
    SELECT 
     R.* 
    FROM 
     RANKED R 
    WHERE 
     R.most_recent = 1 
) 
SELECT 
    * 
FROM 
    MOST_RECENT MR 
    INNER JOIN 
     #ii_t i 
     ON i.id = MR.id 

また、業績の問題に取り組むためには、インダストリーがどのように構成されているかを調べる必要があります。その表には索引が存在しない場合があり、存在する場合は、日付(降順)およびidフィールドをカバーしない可能性があります。上記のクエリの効率を向上させるには、RANKEDセクションのすべてを取り戻さないでください。私はあなたが必要とするフィールドがわからないので、それを行いましたが、明らかに戻ってくる必要が少ないほど、エンジンを効率的に検索することができます。

+0

私は正しい方向に私を操縦してくれてありがとう、多くの人。 – jwe330

0

この(テストされていない)コードを試してみてください。それを見れば、同じことが返ってくるはずです。

select Tdate = max(Industries.Date)  
from #ii_t i 
    left outer join Industries 
    on Industries.id = i.id and 
     Industries.Date <= '22 June 2011' 
group by i.id 
関連する問題