【发布时间】:2014-02-19 03:05:58
【问题描述】:
给定一个十进制值数据库,按位置分组...
CREATE TABLE ItemPrices
(`Company` varchar(11), `LocationID` char(5), `ProductLevel` varchar(11), `LowPrice` decimal(5,2))
;
INSERT INTO ItemPrices
(`Company`, `LocationID`, `LowPrice`)
VALUES
('Company 1', 10001, 100.00),
('Company 2', 10001, 200.00),
('Company 3', 10001, 300.00),
('Company 4', 10001, 400.00),
('Company 1', 10002, 10.00),
('Company 2', 10002, NULL),
('Company 3', 10002, 30.00),
('Company 4', 10002, 40.00)
;
选择位置的最小值很容易:
SELECT LocationID,min(LowPrice) FROM ItemPrices GROUP BY LocationID;
LOCATIONID MIN(LOWPRICE)
10001 100
10002 10
但是使用子查询过滤出最小值并返回下一个最小值并不能按预期工作:
SELECT LocationID,min(LowPrice) FROM ItemPrices
WHERE LowPrice >
(SELECT min(LowPrice)
FROM ItemPrices)
GROUP BY LocationID;
LOCATIONID MIN(LOWPRICE)
10001 100
10002 30
结果应显示 LocationID 10001 的第二低价格为 200,而不是 100。
似乎子查询在所有情况下都只返回最低的LowPrice (10)。正确的逻辑是找到特定 LocationID (100) 的最低价格,然后为 LocationID (200) 找到更大的值并返回更大的值。
如何让子查询知道它应该只评估价格的子集?
只需将GROUP BY 放在那里 (LowPrice > (SELECT min(LowPrice) FROM ItemPrices GROUP BY LocationID)) 就会告诉我Subquery returns more than 1 row -- 是的,当然,它会为每个LocationID 返回一行。
【问题讨论】:
标签: mysql sql group-by correlated-subquery