2011-06-06 33 views
5

我有一組數據,需要爲每個CON/OWNER/METHOD/MATRIX集合提取一條記錄。如果有一個非空RESULT,我想要那個。否則,我想要COUNT最高的那個。我如何查詢?SQL Server查詢從每個子組中選擇1

CON  OWNER  METHOD  MATRIX RESULT COUNT 
*CON_1 OWNER_1 METHOD_A SOLID NULL 503 
CON_1 OWNER_1 METHOD_A SOLID NULL 1 

*CON_1 OWNER_1 METHOD_A SOIL NULL 1305 
CON_1 OWNER_1 METHOD_A SOIL NULL 699 

*CON_2 OWNER_2 METHOD_B SOLID 290  687 
CON_2 OWNER_2 METHOD_B SOLID NULL NULL 
CON_2 OWNER_2 METHOD_B SOLID 450  600 

CON_2 OWNER_2 METHOD_B WATER NULL 1 
*CON_2 OWNER_2 METHOD_B WATER 400  NULL 

對於結果,我想只是加星標的記錄,並且我正在顯示每個組是如何分組的。

這是糟糕的SQL:

select top (1) CON, OWNER, METHOD, MATRIX, RESULT, COUNT 
from #TempTable 
group by CON, OWNER, METHOD, MATRIX 
order by CON, OWNER, METHOD, MATRIX, COUNT 

...因爲我的計數不聚集函數的一部分。它也沒有處理RESULT是否爲NULL,並且top(1)不會從每個分組中返回1。但是,我沒有通過使用更復雜的查詢得到更遠(例如基於在How can I select multiple columns from a subquery (in SQL Server) that should have one record (select top 1) for each record in the main query?問題)

如何從每個分組中選擇一個?

+0

很難選擇接受哪個,@siva,@Paul Creasey或@Andrew Lazarus。所有幫助。安德魯早期的格式很好,排序也很好; Siva的最後有T1.Ranking預選賽;保羅是第一個讓我去的。我對所有人都讚不絕口,既然保羅​​稍稍領先,我會接受。但都是值得的。 – thursdaysgeek 2011-06-07 23:55:04

回答

11

試試這個,不是100%確定它的語法是正確的,但它很接近。

select 
    * 
from 
    (select 
     CON, 
     OWNER, 
     METHOD, 
     MATRIX, 
     RESULT, 
     COUNT, 
     RANK() OVER(PARTITION BY CON, OWNER, METHOD,MATRIX ORDER BY RESULT,COUNT DESC) as rnk 
    FROM #TempTable 
) a 
WHERE rnk = 1 
+0

@Siva,你是對的,忘記了 – 2011-06-06 22:43:34

+0

我不知道我們也可以用這種方式編寫查詢。感謝它解決了我的許多問題。 – Moons 2011-10-19 04:48:21

2

在支持窗口的RDBMS(包括SQL Server 2008,我相信)

SELECT CON, OWNER, METHOD, MATRIX, RESULT, `COUNT` 
FROM 
(SELECT CON, OWNER, METHOD, MATRIX, RESULT, `COUNT`, 
    RANK() OVER (PARTITION BY CON, OWNER, METHOD, MATRIX 
       ORDER BY RESULT DESC, `COUNT` DESC) AS rk 
    FROM temptable 
) AS s 
WHERE rk=1; 

注意每個組文本意味着只有一個非空的結果,但你的例子沒有。此版本將選擇最大結果,除非所有結果相同(例如,NULL),當count將成爲決勝者。順便說一句,COUNT作爲列名會導致各種悲傷。這個版本在結果和計數都相同的情況下也會選擇多行。無論是否有聯繫,將排名切換到row_number只能得到一個。

+0

噢,我不應該使用COUNT作爲名稱。我匿名它,所以它沒有我們的確切名稱。 – thursdaysgeek 2011-06-06 23:24:00

0
select DetailID, field2, field3, field4, MasterID 
from table outer 
where DetailID= 
    (
     select max(DetailID) 
     From table inner 
     where outer.MasterID = inner.MasterID 
     group by MasterID 
    ) 

您可以使用它作爲查看和加入。