Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Возможен ли такой SQL запрос?  [new]
RDS
Member

Откуда:
Сообщений: 106
Существует следующая таблица:
+========+===================+=====================+
+ ID + Tovar + Cost +
+========+===================+=====================+
+ 1 + Товар1 + 10 +
+========+===================+=====================+
+ 2 + Товар1 + 20 +
+========+===================+=====================+
+ 3 + Товар1 + 30 +
+========+===================+=====================+
+ 4 + Товар3 + 40 +
+========+===================+=====================+
+ 5 + Товар2 + 50 +
+========+===================+=====================+
+ 6 + Товар2 + 60 +
+========+===================+=====================+
+ 7 + Товар3 + 70 +
+========+===================+=====================+
Нужно написать такой запрос, который бы выбирал все три товара, соответсвующие первым вхождениям. Результат должен получится таким:
+========+===================+=====================+
+ ID + Tovar + Cost +
+========+===================+=====================+
+ 1 + Товар1 + 10 +
+========+===================+=====================+
+ 4 + Товар3 + 40 +
+========+===================+=====================+
+ 5 + Товар5 + 50 +
+========+===================+=====================+
15 июл 11, 19:04    [10982056]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
RDS,

и где логика?
15 июл 11, 19:18    [10982112]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
select min(ID), Tovar, Cost from tab group by Tovar, Cost
15 июл 11, 19:18    [10982113]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
AmKad
Member

Откуда:
Сообщений: 5308
Makar4ik
select min(ID), Tovar, Cost from tab group by Tovar, Cost

Неверно.

RDS,

row_number.
15 июл 11, 19:19    [10982117]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Makar4ik,
Тогда уж
 
select ID,Tovar,Cost 
from  tab
inner join 
  (select min(ID), Tovar from tab group by Tovar) min_t
    on tab.ID=min_t.ID
15 июл 11, 19:23    [10982124]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Шыфл,

точно! :)
Или так

; with tmp1 (ID, Tovar) as (select min(ID), Tovar from tab group by Tovar)
select tmp1.*, tab.cost from tmp1 inner join t1 on tmp1.ID = tab.ID
order by tmp1.ID
15 июл 11, 19:32    [10982156]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
NETClient
Member

Откуда:
Сообщений: 461
Makar4ik
Шыфл,

точно! :)
Или так

; with tmp1 (ID, Tovar) as (select min(ID), Tovar from tab group by Tovar)
select tmp1.*, tab.cost from tmp1 inner join t1 on tmp1.ID = tab.ID
order by tmp1.ID

Мое наблюдение за участниками этой ветки форума показывает, что большинство уже попробовали row_number, а with никак освоить не могут. У тебя видимо наоборот.
15 июл 11, 19:34    [10982166]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
NETClient
Мое наблюдение за участниками этой ветки форума показывает, что большинство уже попробовали row_number, а with никак освоить не могут. У тебя видимо наоборот.
а как тут row_number поможет?
15 июл 11, 19:48    [10982204]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
NETClient,

Я открыл для себя WITH и рекурсию!
Жалко, что на SQL2k не работает :(

П.с. Век живи, век учись
15 июл 11, 19:49    [10982207]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Шыфл,

Кстати, и твой и мой запросы генерят абсолютно одинаковые планы выполнения. :)
15 июл 11, 19:50    [10982214]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
AmKad
Member

Откуда:
Сообщений: 5308
Makar4ik
NETClient
Мое наблюдение за участниками этой ветки форума показывает, что большинство уже попробовали row_number, а with никак освоить не могут. У тебя видимо наоборот.
а как тут row_number поможет?

with shit as
(select 1 id, 'Tovar1' tovar, 10 cost union all
 select 2 id, 'Tovar1' tovar, 20 cost union all
 select 3 id, 'Tovar1' tovar, 30 cost union all
 select 4 id, 'Tovar3' tovar, 40 cost union all
 select 5 id, 'Tovar2' tovar, 50 cost union all
 select 6 id, 'Tovar2' tovar, 60 cost union all
 select 7 id, 'Tovar3' tovar, 70 cost 
)
select top 1 with ties id, tovar, cost
from shit
order by row_number() over (partition by tovar order by id);

id          tovar  cost        
----------- ------ ----------- 
1           Tovar1 10          
5           Tovar2 50          
4           Tovar3 40          
15 июл 11, 19:54    [10982235]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
NETClient
Member

Откуда:
Сообщений: 461
Шыфл
NETClient,

Я открыл для себя WITH и рекурсию!
Жалко, что на SQL2k не работает :(

П.с. Век живи, век учись

Соболезную.

Makar4ik
Шыфл,

Кстати, и твой и мой запросы генерят абсолютно одинаковые планы выполнения. :)

И что, даже дают одинаковые результаты???
15 июл 11, 19:56    [10982246]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
если есть справочник товаров то можно cross apply использовать. как-то так:

set nocount on

declare @a table( id int primary key , tovar char(10), cost int )

insert into @a ( id, tovar, cost )
select 1, 'Товар1', 10 union all
select 2, 'Товар1', 20 union all
select 3, 'Товар1', 30 union all
select 4, 'Товар3', 40 union all
select 5, 'Товар2', 50 union all
select 6, 'Товар2', 60 union all
select 7, 'Товар3', 70

-- select * from @a
select c.*
from
( select distinct tovar from @a ) as a -- эмулируем справочник товаров
cross apply ( select top 1 id, tovar, cost from @a b where b.tovar = a.tovar order by id ) as c
15 июл 11, 19:57    [10982252]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
NETClient
И что, даже дают одинаковые результаты???
вот не поверите!
два первых запроса выдают то, что попросили.
порядок:
id          tovar  cost        
----------- ------ ----------- 
1           Tovar1 10           
4           Tovar3 40   
5           Tovar2 50
а вот два следующих -
id          tovar  cost        
----------- ------ ----------- 
1           Tovar1 10 
5           Tovar2 50          
4           Tovar3 40   
хотя, row_number работает заметно эффективнее.
Зато хоть cross apply и подтормаживает, но может добавить order by, чтобы выдать верный порядок.
15 июл 11, 20:24    [10982351]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
NETClient
Member

Откуда:
Сообщений: 461
Makar4ik
вот не поверите!

Конечно нет
with shit as
(select 1 id, 'Tovar1' tovar, 10 cost union all
 select 2 id, 'Tovar1' tovar, 20 cost union all
 select 3 id, 'Tovar1' tovar, 30 cost union all
 select 4 id, 'Tovar3' tovar, 40 cost union all
 select 5 id, 'Tovar2' tovar, 50 cost union all
 select 6 id, 'Tovar2' tovar, 60 cost union all
 select 7 id, 'Tovar3' tovar, 70 cost 
)
select min(ID), Tovar, Cost from shit group by Tovar, Cost

id          Tovar  Cost        
----------- ------ ----------- 
1           Tovar1 10          
2           Tovar1 20          
3           Tovar1 30          
4           Tovar3 40          
5           Tovar2 50          
6           Tovar2 60          
7           Tovar3 70          
15 июл 11, 20:29    [10982378]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли такой SQL запрос?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
NETClient
Makar4ik
вот не поверите!

Конечно нет
with shit as
(select 1 id, 'Tovar1' tovar, 10 cost union all
 select 2 id, 'Tovar1' tovar, 20 cost union all
 select 3 id, 'Tovar1' tovar, 30 cost union all
 select 4 id, 'Tovar3' tovar, 40 cost union all
 select 5 id, 'Tovar2' tovar, 50 cost union all
 select 6 id, 'Tovar2' tovar, 60 cost union all
 select 7 id, 'Tovar3' tovar, 70 cost 
)
select min(ID), Tovar, Cost from shit group by Tovar, Cost

id          Tovar  Cost        
----------- ------ ----------- 
1           Tovar1 10          
2           Tovar1 20          
3           Tovar1 30          
4           Tovar3 40          
5           Tovar2 50          
6           Tovar2 60          
7           Tovar3 70          
Эмммм... А вы в какой запрос смотрели-то?
я вообще-то про
; with tmp1 (ID, Tovar) as (select min(ID), Tovar from tab group by Tovar)
select tmp1.*, tab.cost from tmp1 inner join tab on tmp1.ID = tab.ID
order by tmp1.ID
15 июл 11, 20:35    [10982413]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить