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

Откуда: Армения, Ереван
Сообщений: 101
Имеется таблица сообщений

declare @a table (group_id int,message_id int,MessageTitle nvarchar(50),receiveddate date)
INSERT INTO @a VALUES
(1,1,'message 1',Convert(datetime,'01.12.2013',104))
,(2,2,'message 2',Convert(datetime,'05.12.2013',104))
,(5,3,'message 3',Convert(datetime,'06.12.2013',104))
,(3,4,'message 4',Convert(datetime,'07.12.2013',104))
,(2,5,'message 5',Convert(datetime,'08.12.2013',104))
,(2,6,'message 6',Convert(datetime,'09.12.2013',104))
,(4,7,'message 7',Convert(datetime,'10.12.2013',104))
,(3,8,'message 8',Convert(datetime,'11.12.2013',104))
,(4,9,'message 9',Convert(datetime,'12.12.2013',104))
,(3,10,'message 10',Convert(datetime,'13.12.2013',104))

сообщения могут принадлежать различным группам

После

select * from @a
order by group_id,receiveddate DESC

имеем таблицу
group_id message_id MessageTitle receiveddate
1 1 message 1 2013-12-01
2 6 message 6 2013-12-09
2 5 message 5 2013-12-08
2 2 message 2 2013-12-05
3 10 message 10 2013-12-13
3 8 message 8 2013-12-11
3 4 message 4 2013-12-07
4 9 message 9 2013-12-12
4 7 message 7 2013-12-10
5 3 message 3 2013-12-06


нужно составить запрос так, чтобы получить только последние полученные мессиджи по группам, т.е. в результате запроса мы должны иметь следующую таблицу:


group_id message_id MessageTitle receiveddate
1 1 message 1 2013-12-01
2 6 message 6 2013-12-09
3 10 message 10 2013-12-13
4 9 message 9 2013-12-12
5 3 message 3 2013-12-06
22 май 14, 16:43    [16056545]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
должны получить след таблицу

group_id message_id MessageTitle receiveddate
1 1 message 1 2013-12-01
2 6 message 6 2013-12-09
3 10 message 10 2013-12-13
4 9 message 9 2013-12-12
5 3 message 3 2013-12-06
22 май 14, 16:46    [16056580]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
select top (1) with ties .... order by row_number() over(order by group_id, message_id desc)
22 май 14, 16:53    [16056654]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Ах, partition by забыл добавить...
22 май 14, 16:59    [16056728]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
Владислав Колосов,
Спасибо. но можно полностью написать запрос?
22 май 14, 17:05    [16056798]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
cross apply
Guest
сколько групп?
сколько записей в разрезе одной группы?


если групп ограниченное количество и есть их справочник, а записей внутри группы достаточно много то лучше так

1. добавить индекс
group_id, receiveddate DESC (+ можно include-ом все нужные поля в выборке)

2.

select a.*
from dbo.groups g
cross apply (
select top 1 *
from @a a
where a.group_id = g.group_id
order by receiveddate desc
) a
22 май 14, 17:13    [16056874]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
https://www.sql.ru/forum/767360/prostaya-zadacha?mid=8947782#8947782

Для SQL2012 ещё варианты есть - поискать на форуме можно.
22 май 14, 17:31    [16057037]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
cross apply,

Спасибо!! все четко!
22 май 14, 17:37    [16057081]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
можно FIRST_VALUE(...) OVER (PARTITION BY ... ORDER BY ... ) попробовать если SQL 2012
22 май 14, 18:27    [16057338]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - выбор только последних по дате данных  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
iap,

Спасибо!!

много полезного
22 май 14, 18:40    [16057392]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить