Хочется поделиться интересной задачей на сообразительность, обычно я ее задаю на собеседовании. Задача интересна тем, что оказывается многие разработчики не знают, что выполняется раньше GROUP BY или ORDER BY.
Итак, имеем такую таблицу:
| name (имя автомобиля) | price (цена) | seller (продавец автомобиля) |
| bmw | 20 | 1 |
| bmw | 10 | 2 |
| audi | 30 | 2 |
Задача: получить уникальный список автомобилей, минимальную цену по каждому авто и продавца который продает по этой цене (любого продавца если несколько продавцов продают автомобиль по одинаковой цене), чтобы было понятней, вот ожидаемый результат:
| name (имя автомобиля) | price (цена) | seller (продавец автомобиля) |
| bmw | 10 | 2 |
| audi | 30 | 2 |
SELECT t.name, t.price, MIN(t.seller)
FROM t
INNER JOIN (
SELECT name, MIN (price) as min_price FROM t GROUP BY name
) t2 ON t2.name = t.name AND t2.min_price = t. price
GROUP BY t.name, t.price
думаю все понятно, но если нужны пояснения, пишите.
SELECT t.name, t.price, MIN(t.seller)
FROM t
LEFT JOIN t AS t2 ON t2.name = t.name AND t2.price < t.price
WHERE t2.price IS NULL
GROUP BY t.name, t.price
поясню: сначала мы нашли строки товаров, у которых t2.price будет равен NULL, потому что подумайте логически, ведь при джоине образуется такая price меньше которой быть не может, вот в этих строках и возникает NULL. Данный пример для сортировки ASC, а для сортировки DESC просто поменяйте знак меньше на больше.
Оказывается про это тоже забывают, поэтому сразу ответ: по сути это одно и тоже, но GROUP BY дает возможность использовать HAVING:
SELECT seller FROM t GROUP BY seller HAVING COUNT(*) > 1
а вот дополнительно отфильтровать с помощью DISTINCT не выйдет.
Более подробно про GROUP BY: 1 - 2