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

标签 mysql sql group-by correlated-subquery

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

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/

相关文章:

php - WHERE 子句中的 NULL

mysql - 获取按日期分组的最大访问者数量

mysql - 如果使用 where 条件更改了列的数据类型,如何查找列的记录

mysql - Node.js/SQL : Insert only new values

mysql - 如何组合查询?

mysql - SQL Query Select 基于 Group By 的条件

php - 单列的mysql多个非运算符

php - 如何使用 CodeIgniter 在数据库中存储和检索图像

mysql - 连接两个表,按列分组并获取所有列

SQL ANY 查询 - 语法有效