2012-08-14 99 views
1

這是我的SQL視圖 - 讓叫它MyView的:SQL在一列中選擇基於最大值多列不同的行

 
ECode SHCode TotalNrShare CountryCode Country 
000001 +00010 100 UKI United Kingdom 
000001 ABENSO 900 USA United States 
000355 +00012 1000 ESP Spain 
000355 000010 50 FRA France 
000042 009999 10 GER Germany 
000042 +00012 999 ESP Spain 
000787 ABENSO 500 USA United States 
000787 000150 500 ITA Italy 
001010 009999 100 GER Germany 

我想在列最高數字返回單行每個ECode的TotalNrShare。

例如,我想返回從上述鑑於這些結果:

 
ECode SHCode TotalNrShare CountryCode Country 
000001 ABENSO 900 USA United States 
000355 +00012 1000 ESP Spain 
000042 +00012 999 ESP Spain 
000787 ABENSO 500 USA United States 
001010 009999 100 GER Germany 

(注意在ECODE 000787的情況下,存在兩個SHCode與每500,因爲它們是相同的量我們可以只返回第一排而不是兩個,對我來說哪一排是非常重要的,因爲這很少會發生,我的分析不需要100%)

我試過各種東西,但似乎不是能夠返回unqiue結果或我需要的其他國家代碼/國家/地區信息。

這是我的嘗試之一(根據本網站上其他解決方案,但我做錯了什麼):

SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country 
FROM dbo.MyView AS tsh INNER JOIN 
        (SELECT DISTINCT ECode, MAX(TotalNrShare) AS MaxTotalSH 
        FROM dbo.MyView 
        GROUP BY ECode) AS groupedtsh ON tsh.ECode = groupedtsh.ECode AND tsh.TotalNrShare = groupedtsh.MaxTotalSH 
+2

SQL有哪些風味? MySQL,SQL Server,SQLite,Oracle等都具有不同的功能和不同的語法。另外,你嘗試的SQL查詢有什麼問題?您是否收到錯誤消息或「錯誤」結果?如果是這樣,請顯示這些錯誤或錯誤的結果。 – MatBailie 2012-08-14 11:21:58

+0

如果有任何高手能幫助我,我會非常感激! – NSP 2012-08-14 11:22:33

+0

對不起,我的一些文本被切斷了,它的SQL Server 2005 – NSP 2012-08-14 11:23:13

回答

2
WITH 
    sequenced_data AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY ECode ORDER BY TotalNrShare) AS sequence_id 
    FROM 
    myView 
) 
SELECT 
    * 
FROM 
    sequenced_data 
WHERE 
    sequence_id = 1 

這應該,但是,給予相同的結果作爲示例查詢。這完全是一種完成同樣事情的不同方法。

然而,如你所說有什麼不對,請你詳細說明發生了什麼問題?例如TotalNrShare實際上是一個字符串?這是搞亂你的訂購(所以MAX()

編輯:

即使上面的代碼不符合您的SQL Server兼容,因此不應完全崩潰了出來。你應該只是得到一個錯誤信息。例如,嘗試執行Select * By Magic,它應該只是提供一個錯誤。我強烈建議您安裝Management Studio並查看和/或重新安裝。

在可替代的方面,你可以這樣做......

SELECT 
    * 
FROM 
    (SELECT ECode FROM MyView GROUP BY ECode) AS base 
CROSS APPLY 
    (SELECT TOP 1 * FROM MyView WHERE ECode = base.ECode ORDER BY TotalNrShare DESC) AS data 

理想情況下,你會與已經擁有所有你感興趣的ECodes的一個獨特的名單表更換base子查詢in。

+0

謝謝Dems,我試過,但每次我將代碼保存到我的視圖時崩潰。它是用於SQL 2005嗎? (如在SQL Management Studio中崩潰) – NSP 2012-08-14 11:33:38

+0

在回答您關於我的嘗試未做的其他查詢時,它不返回ECode的單個實例。我得到多行,我只想要每個ECode具有最高TotalNrShares的行。我希望我有道理.. – NSP 2012-08-14 11:35:51

+0

@NSP - 是的,它適用於SQL 2005及更高版本。如果它崩潰,請包含錯誤消息,我會爲你尋找。 *(注意:如果在WITH之前有任何語句,那麼它們必須以';'結尾,因此許多人每次都在'WITH'之前放置';',以防萬一)* – MatBailie 2012-08-14 11:37:15

0

試試這個;

with cte as( 
SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country, 
ROW_NUMBER() over (partition by ECode order by SHCode) as row_num 
FROM dbo.MyView) 
select * from cte where row_num=1 
+0

謝謝喬G約瑟夫,我也試過你的代碼。 SQL管理工作室(2005)再次嘗試將我的示例保存在我的視圖中時崩潰。林不知道如果我做錯了什麼或者它不兼容? – NSP 2012-08-14 11:38:33

+0

我試過你的代碼謝​​謝,但我沒有返回具有TotalNrShares列中最高值的行。我發現檢查發現一個ECode有兩行,並返回TotalNrShares中最低值的行。 – NSP 2012-08-15 10:08:48

相關問題