Есть задача требующая решения, помогите кому по зубам
awesome
Дата: 08.09.2006 17:20:40
Заранее извиняюсь за возможно глупый вопрос! но задача есть и ничего кроме нижеописанного в голову не приходит, а нужно максимально правильное и профессиональное решение, потому как нижеописанное не годится для больших объемов данных!
есть таблица с данными
item | price | supplier
a | 10 | x
a | 14 | y
b | 14 | x
b | 11 | y
c | 10 | z
d | 19 | u
надо выбрать item, минимальный price, и соответствующий supplier, то бишь:
item | price | supplier
a | 10 | x
b | 11 | y
c | 10 | z
d | 19 | u
все до чего я додумался:
SELECT t1.item, MIN(t1.price) AS price, (SELECT TOP 1 t2.supplier FROM t AS t2 WHERE t2.item=t1.item ORDER BY t2.price DESC) AS supplier
FROM t AS t1
GROUP BY t1.item
awesome
Дата: 08.09.2006 17:23:05
да забыл сказать что строка уникальная! то есть композитный primary key из трех столбцов
Ray D
Дата: 08.09.2006 17:29:36
а вы индекс сделайте по item, price, supplier
Ray D
Дата: 08.09.2006 17:30:59
а, просмотрел. в pk у вас в каком порядке столбцы?
зы покажите план выполнения
tysh
Дата: 08.09.2006 17:45:52
Можно так:
SELECT t1.item, t1.price, t1.supplier
FROM t AS t1,
(SELECT item, MIN(price) AS price
FROM t
GROUP BY item) AS t2
WHERE t1.item = t2.item AND t1.price = t2.price
awesome
Дата: 08.09.2006 18:56:04
Ray D |
а, просмотрел. в pk у вас в каком порядке столбцы? зы покажите план выполнения |
в таком же порядке
awesome
Дата: 08.09.2006 19:05:43
tysh |
Можно так:
SELECT t1.item, t1.price, t1.supplier FROM t AS t1, (SELECT item, MIN(price) AS price FROM t GROUP BY item) AS t2 WHERE t1.item = t2.item AND t1.price = t2.price |
спасибо за вариант! это должно работать гораздо быстрее!
xeel
Дата: 08.09.2006 20:02:17
А если так:
select item,price,supplier
from t as t1
where price = (select min(price) from t as t2 where t1.item = t2.item)
tysh
Дата: 08.09.2006 20:09:55
xeel |
А если так:
select item,price,supplier from t as t1 where price = (select min(price) from t as t2 where t1.item = t2.item) |
не стоит использовать subquery если этого можно избежать
Александр Волок (def1983)
Дата: 09.09.2006 19:22:20
tysh |
xeel | А если так:
select item,price,supplier from t as t1 where price = (select min(price) from t as t2 where t1.item = t2.item) |
не стоит использовать subquery если этого можно избежать |
Тогда не стоит использовать не ANSI joins если этого можно избежать ;)