在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
感谢您的帮助。
答案 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,则您也可以在结果中包含关联。
答案 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关键字)