2017-05-04 4 views
0

私のデータベースには、製品ごとに異なるタイプのテーブルがあります。私はそのタイプに基づいて各製品のトップレコードを引っ張りたい。現在のクエリは次のとおりです。SQLクエリは、リストから各タイプのトップ1値を引き出しますか?

SELECT 
    dh_type, 
    dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' 
    AND dh_type IN ('New','Old','Ref') 
ORDER BY dh_createDt DESC 

各タイプには、異なる日付に作成された複数の製品が存在することがあります。私は各タイプのトップレコード(作成日に基づいて最新のレコード)を取得したい。 1つは新、もう1つは古い、もう1つはRefです。私はSQLでそれを行うための最高の効率的な方法は何ですか?現在のクエリでは、各タイプごとに複数のレコードが取得されますが、1つだけ必要です。

+1

いくつかのサンプルテーブルデータと期待される結果、および書式付きテキストを追加します。 – jarlh

答えて

2

row_number()のようなウィンドウ機能を使用することで、一方向にする方法はさまざまです。 row_number関数を使用すると、パーティションを持つ各行に一意の番号を作成できます。その場合、パーティションはdh_typeであり、次にdh_createDTで番号の作成を指示します。最終結果は、結果はあなたにそれをバックに参加、その後、各dh_typedh_productためmax(dh_createDT)を取得するサブクエリを使用することです取得するための別の方法= 1:

select dh_type, 
     dh_product 
from 
(
    SELECT 
     dh_type, 
     dh_product, 
     rn = row_number() over(partition by dh_type order by dh_createDT desc) 
    FROM myProducts 
    WHERE dh_productid = '08-BLD4011603S0' 
     AND dh_type IN ('New','Old','Ref') 
) d 
where rn = 1; 

ROW_NUMBERを持つ行になりますテーブル:

select 
    dh_type, 
    dh_product 
from myProducts p 
inner join 
(
    select 
    dh_type, 
    dh_product, 
    MaxDate = max(dh_createDT) 
    from myProducts 
    where h_productid = '08-BLD4011603S0' 
    and dh_type IN ('New','Old','Ref') 
    group by dh_type, dh_product 
) p1 
    on p.dh_type = p1.dh_type 
    and p.dh_product = p1.dh_product 
    and p.dh_createDT = p1.MaxDate 
where p.h_productid = '08-BLD4011603S0' 
    and p.dh_type IN ('New','Old','Ref') 
1

Ollieには本当に良い回答があります。パフォーマンスが問題である場合は、その後、以下がより速くなることがあります。

(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'New' 
ORDER BY dh_createDt DESC 
) UNION ALL 
(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'Old' 
ORDER BY dh_createDt DESC 
) UNION ALL 
(SELECT TOP (1) dh_type, dh_product 
FROM myProducts 
WHERE dh_productid = '08-BLD4011603S0' AND dh_type = 'Ref' 
ORDER BY dh_createDt DESC 
); 

パフォーマンスを得るために、あなたはmyProducts(dh_productid, dh_type, dh_createDt)にインデックスをしたいです。 dh_productでも可能ですので、インデックスは完全にクエリをカバーしています。

関連する問題