2012-02-29 11 views
0

私は、反復せずに列にDISTINCT項が必要なクエリを設計したいと考えています。私はSQL Server 2008 R2エディションを使用しています。ここでSQL特定の列の用語の反復を避けるためのクエリ

は私のサンプルテーブルです:私が欲しいもの

id bank_code bank_name interest_rate 
---------------------------------------------------------- 
1 123   abc   3.5 
2 456   xyz   3.7 
3 123   abc   3.4 
4 789   pqr   3.3 
5 123   abc   3.6 
6 456   xyz   3.1 

は「interest_rates」列ではなく、「bank_code」における用語のいずれかの繰り返しなし降順テーブルをソートすること、です。ここで

は、私が欲しいものです:

id bank_code bank_name interest_rate 
---------------------------------------------------------- 
2 456   xyz   3.7 
5 123   abc   3.6 
4 789   pqr   3.3 

私はDISTINCT演算子をしようとしているが、それはすべての列はなく、繰り返しのための単一のカラムのユニークな組み合わせを選択します。ここ は明らかに私が欲しいものを私に取得しないだろうこれは、私がやっているものです:

SELECT DISTINCT TOP 5 [ID], [BANK_CODE] 
     ,[BANK_NAME] 
     ,[INTEREST_RATE] 
    FROM [SAMPLE] 
    ORDER BY [INTEREST_RATE] DESC 

は、これを達成する方法はありますか? 何か助けていただければ幸いです。

+0

金利を選択する基準を決める必要があります。結果から、特定のbank_code/bank_nameの最大金利のように見えます。しかしIDはこれに従っているようには見えないので、あなたはID選択のロジックを説明できますか? – Andrew

+0

IDは、選択/ソートされたレコードに対応します。私はID列の上/下でソート(または他の操作を実行)したくありません。 – YashG99

+0

abcの結果行はそのルールに従いません。 abc for 3.6のIDは5です。 – Andrew

答えて

4
;WITH x AS 
(
    SELECT id,bank_code,bank_name,interest_rate, 
     rn = ROW_NUMBER() OVER (PARTITION BY bank_code ORDER BY interest_rate DESC) 
    FROM dbo.[SAMPLE] 
) 
SELECT id,bank_code,bank_name,interest_rate 
FROM x WHERE rn = 1 
ORDER BY interest_rate DESC; 
+0

驚くばかり!ありがとう、トン! – YashG99

2

分析機能を使用してみてください:[]構文について

;WITH CTE AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY bank_code ORDER BY interes_rate DESC) Corr 
    FROM [Sample] 
) 
SELECT id, bank_code, banck_name, interest_rate 
FROM CTE 
WHERE Corr = 1 
1

わからないが、あなたは、おそらくこのようなものが必要:

SELECT min([ID]), [BANK_CODE], [BANK_NAME], max([INTEREST_RATE]) 
FROM [SAMPLE] 
GROUP BY [BANK_CODE], [BANK_NAME] 
ORDER BY 4 DESC 
+0

これは正しい結果を生み出すことはできませんが、IDと金利は一致しません。 – Andrew

+0

グルーピングがここにあるのかどうかわかりません。最も高い金利が最低のIDと必ずしも一致しないので、2つの列を潜在的に混在させる可能性があります。また、金利が同じである2つのケースがある場合はどうなりますか?あなたは2つの行を返します。また、 'ORDER BY 'を使用しないでください...これは非常に壊れやすいです(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits-to-kick-order- by-ordinal.aspx)。列にエイリアスを指定すると、現在の結果セットの列ではなくエイリアス名を参照できます。 –

+0

それは私のものではなく、必要な別名を書いてORDER BYで使うことができます。そして、 'max()'はグループ関数です。同じ最大値を持つ行の数にかかわらず1行を返します。 – Aprillion

0

どのようにこのような何かについて。それは簡単ですが、同じ金利があれば複製されます。

select ID, #sample.Bank_code, bank_name, #sample.interest_Rate 
from #sample 
join 
(
    SELECT [BANK_CODE], MAX(interest_rate) as interest_Rate 
    FROM #sample 
    GROUP BY bank_code 
) as groupingtable 
    on groupingtable.bank_code = #sample.bank_code 
     and groupingtable.interest_Rate = #sample.interest_rate 
関連する問題