gpt4 book ai didi

mysql - SQL:使用 GROUP BY 子句选择第二低的值(通过子查询)

转载 作者:行者123 更新时间:2023-11-29 02:26:09 25 4
gpt4 key购买 nike

给定一个十进制值数据库,按位置分组......

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))告诉我 子查询返回超过 1 row -- 对,当然,它为每个 LocationID 返回一行。

最佳答案

在输入这个问题时,我突然想到我需要一个相关的子查询。第一步是为表ItemPrices 起别名。我将 i 用于外部查询,将 s 用于子查询。

SELECT i.LocationID,min(LowPrice) FROM ItemPrices i
WHERE
LowPrice >
(SELECT min(LowPrice)
FROM ItemPrices s
WHERE i.LocationID = s.LocationID)
GROUP BY LocationID;

让我们运行吧!

LOCATIONID  MIN(LOWPRICE)
10001 200
10002 30

看起来不错!你怎么看?

SQLFiddle:http://sqlfiddle.com/#!2/341ce/5

关于mysql - SQL:使用 GROUP BY 子句选择第二低的值(通过子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com