SQL查询,MIN不会返回最低值

时间:2015-08-08 00:59:46

标签: sql postgresql greatest-n-per-group

Model          Make          Price
--------------------------------------
Ford            42            23454
Ford            32            21422
Ford            12            19000
GM              12            14343
GM              32            21345
GM              14            12343
BMW             32            43355

这是一个示例表(简化)。我想要做的是找到最接近每个模型的输入的价格。然后返回最接近的模型,品牌和价格。

例如,$ 20,000。结果将是:

   Model  Make  Price
 ----------------------
1) Ford    12    19000        ($1000 difference)
2) GM      32    21345        ($1234 difference)
3) BMW     32    43355        ($23355 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;

内心并没有只返回最小的差异而是全部。不知道如何纠正这个。

感谢。

1 个答案:

答案 0 :(得分:3)

只需使用ORDER BYLIMIT

SELECT t.*, ABS(20000 - price) as difference 
FROM table t
ORDER BY ABS(20000 - price)
LIMIT 3;

您可以将LIMIT增加或减少到您想要的多行。

您的查询存在的问题是您要加入modelprice,而不是加入difference

编辑:

对于每个模型一行,使用窗口函数:

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);