2015-11-18 84 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