Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5146
через оконные ф-ии пробовали?
22 авг 14, 12:18    [16479109]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
Нет. Пример если не сложно и будет ли быстрее запрос выполнятся?
22 авг 14, 12:20    [16479117]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5146
как вариант
select top 1 with ties
[id], [ФИО], [Дата], [Проходная], [транспорт]
from
table1
order by
row_number()over(partition by [ФИО] order by [Дата] desc)

Soldat104
будет ли быстрее запрос выполнятся?
кто ж вам скажет не видя вашу систему, планы выполнения смотрите.
22 авг 14, 12:27    [16479171]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
Понял. Спасибо. Может быть ещё варианты есть?
22 авг 14, 12:34    [16479204]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Jaffar
Member

Откуда:
Сообщений: 636
Soldat104,



если нужна скорость то нужно смотреть индексы, планы запроса.

а просто перебирать планы запроса считается тут дурным тоном.
22 авг 14, 12:40    [16479253]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
Я Вас понял, спасибо. Мне изначально не нравилось многократное обращение к одной и тойже таблице.
22 авг 14, 12:45    [16479288]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Soldat104
Мне изначально не нравилось многократное обращение к одной и тойже таблице.

Число упоминаний таблицы в тексте запроса может быть не равно числу физических обращений к ней
22 авг 14, 12:52    [16479334]     Ответить | Цитировать Сообщить модератору
 Re: Выборка.  [new]
aleks2
Guest
Soldat104
Понял. Спасибо. Может быть ещё варианты есть?

Быстрее не бывает.

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 Ответить