SQL 查询,MIN 不只返回最低值
SQL Query, MIN isn't returning just the lowest value
Model Make Price
--------------------------------------
Ford 42 23454
Ford 32 21422
Ford 12 19000
GM 12 14343
GM 32 21345
GM 14 12343
BMW 32 43355
这是一个示例 table(已简化)。我想要做的是为每个模型找到最接近输入的价格。然后 return 最接近的型号、品牌和价格。
例如,20,000 美元。结果将是:
Model Make Price
----------------------
1) Ford 12 19000 (00 difference)
2) GM 32 21345 (34 difference)
3) BMW 32 43355 (355 difference)
这是我当前的 SQL(使用 Postgres):
SELECT model, make, price, difference
FROM (
SELECT model, price, MIN(ABS(20000 - price)) as difference
FROM table
GROUP BY model, price)
INNER JOIN ON model, price;
内部不只是 return 最小差异,而是所有差异。不确定如何更正此问题。
谢谢。
只需使用 ORDER BY
和 LIMIT
:
SELECT t.*, ABS(20000 - price) as difference
FROM table t
ORDER BY ABS(20000 - price)
LIMIT 3;
您可以根据需要增加或减少 LIMIT
行数。
您查询的问题是您是在 model
和 price
上加入,而不是在 difference
上加入。
编辑:
对于每个模型一行,使用 window 函数:
SELECT t.*, ABS(20000 - price) as difference
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY model ORDER BY ABS(20000 - price)) as seqnum
FROM table t
) t
WHERE seqnum = 1;
ORDER BY ABS(20000 - price);
Model Make Price
--------------------------------------
Ford 42 23454
Ford 32 21422
Ford 12 19000
GM 12 14343
GM 32 21345
GM 14 12343
BMW 32 43355
这是一个示例 table(已简化)。我想要做的是为每个模型找到最接近输入的价格。然后 return 最接近的型号、品牌和价格。
例如,20,000 美元。结果将是:
Model Make Price
----------------------
1) Ford 12 19000 (00 difference)
2) GM 32 21345 (34 difference)
3) BMW 32 43355 (355 difference)
这是我当前的 SQL(使用 Postgres):
SELECT model, make, price, difference
FROM (
SELECT model, price, MIN(ABS(20000 - price)) as difference
FROM table
GROUP BY model, price)
INNER JOIN ON model, price;
内部不只是 return 最小差异,而是所有差异。不确定如何更正此问题。
谢谢。
只需使用 ORDER BY
和 LIMIT
:
SELECT t.*, ABS(20000 - price) as difference
FROM table t
ORDER BY ABS(20000 - price)
LIMIT 3;
您可以根据需要增加或减少 LIMIT
行数。
您查询的问题是您是在 model
和 price
上加入,而不是在 difference
上加入。
编辑:
对于每个模型一行,使用 window 函数:
SELECT t.*, ABS(20000 - price) as difference
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY model ORDER BY ABS(20000 - price)) as seqnum
FROM table t
) t
WHERE seqnum = 1;
ORDER BY ABS(20000 - price);