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

Это примерная таблица (упрощенная). То, что я пытаюсь сделать, это найти цену, ближайшую к входу для каждой модели. Затем верните Model, Make и Price, которые наиболее близки.SQL Query, MIN не возвращает только самое низкое значение

Например, за 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; 

Внутренний не возвращает только минимальную разницу, но все. Не знаете, как это исправить.

Спасибо.

+0

это, безусловно, круто вопрос – Drew

ответ

3

Просто используйте ORDER BY и LIMIT:

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

Вы можете увеличить или уменьшить LIMIT до однако количество строк, которые вы хотите.

Проблема с вашим запросом заключается в том, что вы соединяетесь по model и price, но не по difference.

EDIT:

Для одной строки в модели, используйте оконные функции:

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

я думаю, что он хочет, чтобы его 1 строку в зависимости от модели. О, я вижу, вы работаете над iner – Drew

+0

удивительным, что круто – Drew

Смежные вопросы