Giải pháp 2 của tôi cho SQL 2005 dưới đây. Những cái khác tôi có thể thấy cho đến nay có thể không trả lại dữ liệu chính xác nếu hai trong số các số liệu bán hàng giống nhau. Điều đó phụ thuộc vào nhu cầu của bạn mặc dù.
Đầu tiên sử dụng hàm Row_Number(), tất cả các hàng được xếp hạng từ mức thấp nhất đến doanh số cao nhất (sau đó là một số quy tắc ràng buộc). Sau đó, thứ hạng cao nhất được chọn cho mỗi cửa hàng để có được kết quả.
Bạn có thể thử thêm mệnh đề Partion By vào hàm Row_Number (xem BOL) và/hoặc điều tra bằng cách sử dụng phép nối bên trong thay vì mệnh đề "in".
Thứ hai, mượn ý tưởng của chìa khóa trao tay, lại xếp hạng chúng, nhưng phân vùng theo cửa hàng, vì vậy chúng tôi có thể chọn xếp hạng đầu tiên. Dense_Rank có thể sẽ cung cấp cho hai hàng giống hệt nhau cùng một cấp bậc, vì vậy nếu cửa hàng và bộ phận không phải là duy nhất, nó có thể trả về hai hàng. Với Row_number số là duy nhất trong phân vùng.
Một số điều cần lưu ý là điều này có thể chậm, nhưng sẽ nhanh hơn đối với hầu hết các tập dữ liệu hơn truy vấn phụ trong một trong các giải pháp khác. Trong giải pháp đó, truy vấn sẽ phải được chạy một lần cho mỗi hàng (bao gồm cả phân loại vv), có thể dẫn đến nhiều truy vấn.
Truy vấn khác chọn doanh số tối đa trên mỗi cửa hàng và trả lại dữ liệu theo cách đó, trả lại hàng trùng lặp cho một cửa hàng nếu hai phòng ban có cùng doanh số bán hàng. Truy vấn cuối cùng cho thấy điều này.
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
Nền tảng cơ sở dữ liệu nào? sql server? oracle? – TheSoftwareJedi
người đã nghĩ rằng mì sẽ rất phổ biến ở vancouver, eh? – TheSoftwareJedi
Đó là "chọn một người chiến thắng" một lần nữa. http://stackoverflow.com/questions/246870/simple-sql-query –