我对 SQL 2005 的 2 个解决方案如下。如果两个销售数据相同,那么到目前为止我可以看到的其他数据可能不会返回正确的数据。不过,这取决于您的需求。
第一个使用 Row_Number() 函数,所有行从最低到最高销售额排名(然后是一些平局规则)。然后每个商店选择最高排名以获得结果。
您可以尝试将 Partion By 子句添加到 Row_Number 函数(请参阅 BOL)和/或使用内部联接而不是“in”子句进行调查。
第二个,借用Turnkey的思路,再次对它们进行排名,但是是按商店分区,所以我们可以选择排名第一的。Dense_Rank 可能会给两个相同的行提供相同的排名,因此如果 store 和 department 不是唯一的,它可以返回两行。使用 Row_number 编号在分区中是唯一的。
需要注意的一些事情是,这可能会很慢,但对于大多数数据集来说,它会比其他解决方案之一中的子查询更快。在该解决方案中,查询必须每行运行一次(包括排序等),这可能会导致大量查询。
其他查询选择每个商店的最大销售额并以这种方式返回数据,如果两个部门碰巧有相同的销售额,则返回商店的重复行。最后一个查询显示了这一点。
DECLARE @tbl as TABLE (store varchar(20), department varchar(20), sales int)
INSERT INTO @tbl VALUES ('Toronto', 'Baskets', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Noodles', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Baskets', 200)
-- Expect Toronto/Noodles/500 and Halifax/Fish/300
;WITH ranked AS -- Rank the rows by sales from 1 to x
(
SELECT
ROW_NUMBER() OVER (ORDER BY sales, store, department) as 'rank',
store, department, sales
FROM @tbl
)
SELECT store, department, sales
FROM ranked
WHERE rank in (
SELECT max(rank) -- chose the highest ranked per store
FROM ranked
GROUP BY store
)
-- Another way
SELECT store, department, sales
FROM (
SELECT
DENSE_RANK() OVER (PARTITION BY store ORDER BY sales desc,
store desc, department desc) as 'rank',
store, department, sales
FROM @tbl
) tbl
WHERE rank = 1
-- This will bring back 2 rows for Toronto
select tbl.store, department, sales
from @tbl tbl
join (
select store, max(sales) as maxSales from @tbl group by store
) tempTable on tempTable.store = tbl.store
and tempTable.maxSales = tbl.sales