2012-02-29 36 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 2012-02-29 18:24:33

+0

該ID對應於選定/排序的記錄。我不想在ID列上進行排序(或執行任何其他操作)。 – YashG99 2012-02-29 18:25:56

+0

abc的結果行不遵循該規則。 abc for 3.6的ID爲5. – Andrew 2012-02-29 18:26:29

回答

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 2012-02-29 18:34:18

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 2012-02-29 18:29:49

+0

我不知道分組是否在這裏......因爲最高的利率不一定與最低的ID匹配,所以它可能會混合兩列。另外如果有兩種情況下利率相同?你會返回兩行。也請不要使用'ORDER BY '......這是非常脆弱的(見http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits-to-kick-order-通過-ordinal.aspx)。如果您給列添加別名(如您應該那樣),那麼您現在可以引用別名,而不是列中結果集中的列。 – 2012-02-29 18:30:43

+0

它不是我的,你可以寫任何你需要的別名並在ORDER BY中使用它們,而max()是一個組函數,無論有多少行具有相同的最大值,它將返回1行 – Aprillion 2012-02-29 18:33:33

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