th3mis
@th3mis

Как составить SQL запрос?

Есть таблица:
TABLE products (
id,
name,
price
);

Нужно вернуть уникальные имена товаров, и последнюю цену для них (наибольший id)

Раньше делал через 1 запрос с DISTINCT товаров, и для каждого еще по запросу делал, но понял что очень медленно, и можно как-то сделать в один запрос, вот только как именно не могу понять.
  • Вопрос задан
  • 215 просмотров
Пригласить эксперта
Ответы на вопрос 3
@dmitryKovalskiy
программист средней руки
select name, MAX(price) from products 
GROUP BY name

Но если у вас в таблице одинаковые товары под разными id с разными ценами хранятся - это архитектурная дичь, которая будет порождать баги сотнями.
UPD:
select name, MAX(id) from products 
GROUP BY name

Забирайте. но ваше решение - плохое. У вас продукт один, а записей по нему много. Вы всю дорогу будете спотыкаться об выяснение актуального id на данный товар, причем по косвенным признакам, которые не являются индексами.
Ответ написан
k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL
Написал вам тестовый кусок с использованием RANK для ваших целей
CREATE TABLE #products (
id int,
name nvarchar(255),
price money
)
insert into #products
(
id,
name,
price
)
values
(0,'пиво',100),(1,'водка',200),(2,'пиво',150),(3,'пиво',100),(4,'спирт',1000)


SELECT 
	id,
	name,
	price
FROM (
SELECT id
	,NAME
	,price
	,RANK() OVER (PARTITION BY NAME ORDER BY ID DESC) RNK
FROM #products ) X
where X.RNK=1
Ответ написан
Комментировать
@bizon2000
Java-программист
Стандартным прямолинейным решением будет следующий запрос:
SELECT t.name, (SELECT p.price FROM products p WHERE p.id = t.max_id) AS last_price
    FROM (SELECT name, max(id) AS max_id FROM products GROUP BY name) t

Однако, очень рекомендую вам разобраться с предыдущим решением (с использованием RANK()) -- некоторые задачи просто невозможно решить без использования этой конструкции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы