Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Есть таблица: id, ФИО, Дата, Проходная, транспорт. Нужно для каждой ФИО выбрать полностю всю строку последнего прихода на службу. id, ФИО, Дата Проходная транспорт. 1 Пупкин 1.1.2014 КПП1 Пешком 2 Пупкин 2.1.2014 КПП2 Авто 3 Иванов 17.1.2014 КПП1 Пешком 4 Пупкин 5.1.2014 КПП2 Авто 5 Иванов 18.1.2014 КПП1 Пешком Результат: id, ФИО, Дата Проходная транспорт. 4 Пупкин 5.1.2014 КПП2 Авто 5 Иванов 18.1.2014 КПП1 Пешком Есть варианты: 1. select t1.* from table1 as t1 inner join (select max(Дата), ФИО from table1 group by ФИО ) as t2 on t1.ФИО= t2.ФИО and t1.ДАта=t2.ДАта 2. select t1.* from table1 as t1 where t1.Дата in (select max(Дата) from table1 where t1.ФИО =ФИО group by ФИО ) или подобный с Exists Вопрос: Как можно сделать такую выборку обращаясь единожды к таблице table1 ? Или более быстрый вариант выборки... Индексы, статистики задействованы. |
22 авг 14, 12:09 [16479047] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
через оконные ф-ии пробовали? |
22 авг 14, 12:18 [16479109] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Нет. Пример если не сложно и будет ли быстрее запрос выполнятся? |
22 авг 14, 12:20 [16479117] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
как вариантselect top 1 with ties [id], [ФИО], [Дата], [Проходная], [транспорт] from table1 order by row_number()over(partition by [ФИО] order by [Дата] desc)
|
||
22 авг 14, 12:27 [16479171] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Понял. Спасибо. Может быть ещё варианты есть? |
22 авг 14, 12:34 [16479204] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Soldat104, если нужна скорость то нужно смотреть индексы, планы запроса. а просто перебирать планы запроса считается тут дурным тоном. |
22 авг 14, 12:40 [16479253] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Я Вас понял, спасибо. Мне изначально не нравилось многократное обращение к одной и тойже таблице. |
22 авг 14, 12:45 [16479288] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Число упоминаний таблицы в тексте запроса может быть не равно числу физических обращений к ней |
||
22 авг 14, 12:52 [16479334] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Быстрее не бывает. declare @t table(id , ФИО primary key clustered with( IGNORE_DUP_KEY = ON ) , Дата Проходная транспорт ); insert @t select * from [Есть таблица] order by Дата DESC; select * from @t; |
||
22 авг 14, 15:01 [16480443] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |