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

Откуда:
Сообщений: 66
С Новым Годом!, товарищи.
Простой вопрос необходимо получить выборку последних заказов для каждого клиента
Select C.Client_ID, C.DocnNo, C.Date 
from Customers C
Where Customers.Date = 
             (Select Max(Date) from Customers C1
              where C1.Client_ID = C.Client_ID)
но, так как дата без времени, а за один день может несколько заказов получаем
Клиент1 12345 30.01.10
Клиент2 12346 01.01.10
Клиент2 12347 01.01.10
а нужна только одна запись любая 12346 или 12347, какие будут вариант кроме
курсора??
Спасибо за ответы.
30 дек 09, 17:53    [8138860]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
top 1
30 дек 09, 17:54    [8138864]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
способов полно
вот хотя бы два:
1)row_number()
) cross apply + top 1

-----------------
open your mind
30 дек 09, 17:55    [8138871]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
rus_bug
Member

Откуда:
Сообщений: 66
я не понял Куда top 1 - нужна только одна запись любая, но для каждого клиента.
с cross join можно пример.
30 дек 09, 18:33    [8139001]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
aleks2
Guest
Чти, страдалец

https://www.sql.ru/forum/actualthread.aspx?tid=722987
30 дек 09, 18:34    [8139007]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
aleks2
Guest
Select C.Client_ID, C.DocnNo, C.Date 
from Customers C
Where Customers.ID = 
             (Select TOP 1 ID from Customers C1
              where C1.Client_ID = C.Client_ID ORDER BY Date DESC, ID DESC)

Естественно, необходимо наличие уникального ключа ID.
30 дек 09, 18:40    [8139028]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
Cергей L
Member

Откуда: Москва
Сообщений: 15
rus_bug,
declare @Customers table ( Client_ID integer, DocnNo integer, Date datetime );

insert into @Customers values ( 1, 12345, convert ( datetime, '30.01.10', 4 ) ) ;
insert into @Customers values ( 2, 12346, convert ( datetime, '01.01.10', 4 ) ) ;
insert into @Customers values ( 2, 12347, convert ( datetime, '01.01.10', 4 ) ) ;

select * from ( select distinct Client_ID from @Customers ) c
cross apply
( select top 1 DocnNo, Date from @Customers c1 where c1.Client_ID = c.Client_ID order by Date desc ) b
30 дек 09, 20:22    [8139285]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос  [new]
rus_bug
Member

Откуда:
Сообщений: 66
Спасибо за ответы, С Новым ГОДОМ!)))
Вариант aleks2 отлично, есть еще такой вариант вариант, но подходит в частном случае (если поля в select уникальны т.е. в данном случае DocNo не повторяется)

Select C.Client_ID, C.Date, Max(C.DocnNo) DocnNo
from Customers C
Where С.Date =
(Select Max(Date) from Customers C1
where C1.Client_ID = C.Client_ID)
Group By C.Client_ID, C.Date

проверю вариант cross apply посмотрим что быстрее ;
4 янв 10, 14:55    [8146360]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить