2016-09-05 2 views
0

У меня есть таблица:выбрать одну строку на данных с агрегатными функциями

  price 
--------------------- 
     id | int (PK) 
unit_price | number 
    part_id | int (FK) 
     line | int 

С уникальным ограничением на part_id и line (так детали могут иметь несколько цен, дифференцированные по «линии»)

К визуализировать:

id | unit_price | part_id | line 
-------------------------------- 
1 |  100.00 |  1 | 1 
2 |  150.00 |  1 | 2 
3 |  90.00 |  1 | 3 
-------------------------------- 
4 |  75.00 |  2 | 1 
5 |  70.00 |  2 | 2 
-------------------------------- 
6 |  90.00 |  3 | 1 
7 |  95.00 |  3 | 2 

Мне нужно написать запрос, который будет принимать низкой «линии» для каждого часть и показать цену, поэтому выход будет так:

id | unit_price | part_id | line 
-------------------------------- 
1 |  100.00 |  1 | 1 
4 |  75.00 |  2 | 1 
6 |  90.00 |  3 | 1 

Я начал с этим запросом:

SELECT min(line), unit_price, part_id 
FROM price 
GROUP BY ... ? 

Но я быстро понял, что если я добавить unit_price и part_id к статье GROUP BY, то это в основном даст мне исходный результат (все), потому что каждый unit_price уникален. Но я не могу GROUP BY part_id сам по себе, потому что unit_price должен быть включен в предложение GROUP BY.

Должен ли я использовать агрегат min функции для выбора только один номер на part_id? Я думаю, что я мог бы лаять неправильное дерево с GROUP BY. Я только представляю это в вопросе, чтобы показать вещи, которые я пробовал.

В моем наборе данных не все цены гарантированны, начиная с '1', поэтому условие = 1 не будет работать. Мне нужен минимум. Кроме того, я использую MySQL, но я думаю, что, возможно, это не имеет значения.

ответ

2

Вот общий подход с использованием join с подзапроса, который использует min:

select p.id, p.unit_price, p.part_id, p.line 
from price p join (
    select part_id, min(line) as line 
    from price 
    group by part_id 
    ) t on p.part_id = t.part_id and p.line = t.line 
0

Пожалуйста, используйте ниже запрос

Запрос: -

select p1.* from price as p1 
where p1.id = (select p2.id from price as p2 
       where p2.part_id = p1.part_id 
       order by p2.line asc limit 0,1) 
group by p1.id 
Смежные вопросы