2015-11-18 87 views
0

在T-SQL(MSSql 2008R2)中,我想從一個表或一組結果中選擇某些行;根據其最小最大值選擇某些行

StoreId StoreName BrochureId PageId Rank Distance 
43561 X   1627  11608 73 598.10 
43561 X   1627  11591 68 598.10 
43561 X   1627  11615 41 598.10 
43827 Y   1727  21708 75 1414.69 
43827 Y   1727  21591 62 1414.69 
43827 Y   1727  21615 44 1414.69 
43919 Z   1827  31809 77 2487.35 
43919 Z   1827  31591 60 2487.35 
43919 Z   1827  31615 39 2487.35 

想只選擇距離最近且排名最高的行,

StoreId StoreName BrochureId PageId Rank Distance 
43561 X   1627  11608 73 598.10 
43827 Y   1727  21708 75 1414.69 
43919 Z   1827  31809 77 2487.35 

謝謝你的幫忙。

回答

1

您可以使用ROW_NUMBER。

SELECT * FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY StoreName ORDER BY Distance, [Rank] DESC) Rn 
    FROM 
     Table1 
) t 
WHERE Rn = 1 

還有其他的排名功能,您可以使用以及..例如,如果你使用RANK,而不是ROW_NUMBER在這裏,您可以在您的結果的關係也是如此。

SQL Ranking Functions

+0

謝謝你的幫助,這個結果正是我想達到的目標。 – Buyukcaglar

0

使用相關子查詢的WHERE子句中......假設你的表名是MyTable的,這樣的事情應該得到你想要的東西:

SELECT [StoreId], [StoreName], [BrochureId], [PageId], [Rank], [Distance] 
    FROM MyTable m 
WHERE [Rank] = (SELECT MAX([Rank]) FROM MyTable x WHERE x.StoreId = m.StoreId) 
    OR [Distance] = (SELECT MIN([Distance]) FROM MyTable y WHERE y.StoreId = m.StoreId) 

(注意,我封閉列因爲「Rank」是一個保留的SQL關鍵字)

+0

性能會很差,特別是對於大型數據集。如果可能,儘量避免相關的子查詢。在這種情況下,窗口功能是可能的。 – Vanlightly