根据最小最大值选择某些行

时间:2015-11-18 22:23:38

标签: sql-server sql-server-2008 tsql

在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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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关键字)