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

Откуда:
Сообщений: 271
По задаче, нужно извлечь максимальное и минимальное значение времени на каждую дату по каждому контрагенту
+
use tempdb
go

declare @tab table(fio nvarchar(100),dattime datetime);
insert into @tab (fio,dattime) values
('Неверовский Павел Иванович','01.02.2015 00:06'),
('Неверовский Павел Иванович','01.02.2015 00:12'),
('Неверовский Павел Иванович','01.02.2015 00:22'),
('Неверовский Павел Иванович','01.02.2015 00:55'),
('Неверовский Павел Иванович','01.02.2015 01:03'),
('Неверовский Павел Иванович','01.02.2015 02:54'),
('Неверовский Павел Иванович','01.02.2015 02:57'),
('Григорьевич Андрей Игоривич ','01.02.2015 05:00'),
('Григорьевич Андрей Игоривич ','01.02.2015 05:06'),
('Горальчук Елена Владимировна','01.02.2015 07:40'),
('Горальчук Елена Владимировна','01.02.2015 07:41'),
('Короткий Игорь Анатольевич','01.02.2015 08:38'),
('Смирнов Андрей Михайлович','01.02.2015 08:40'),
('Смирнов Андрей Михайлович','01.02.2015 08:45'),
('Разовый №16','01.02.2015 08:49'),
('Разовый №16','01.02.2015 09:08'),
('Смирнов Андрей Михайлович','01.02.2015 09:51');


Этот вариант запроса возвращает правильный набор значений:
 select fio
  ,convert(nvarchar(12),dattime,104) as'Дата'
  ,convert(nvarchar(5),(select top 1 dattime from @tab t2 where t1.fio=t2.fio and convert(nvarchar(12),t1.dattime,104)=convert(nvarchar(12),t2.dattime,104) order by dattime),108)  as 'Вход'
  ,convert(nvarchar(5),(select top 1 dattime from @tab t3 where t1.fio=t3.fio and convert(nvarchar(12),t1.dattime,104)=convert(nvarchar(12),t3.dattime,104) order by dattime desc),108) as 'Выход'
 from @tab t1
 group by fio
 ,convert(nvarchar(12)
 ,dattime,104)
.

А с использованием функций MAX MIN в оконных функциях почему-то не происходит группировка. и пришлось использовать distinct:
 select distinct
   t1.fio
  ,convert(nvarchar(12),t1.dattime,104) as 'Дата'
  ,max(convert(nvarchar(5),t1.dattime,108)) over (partition by fio, convert(nvarchar(12),dattime,104)) as 'Выход'
  ,min(convert(nvarchar(5),t1.dattime,108)) over (partition by fio, convert(nvarchar(12),dattime,104)) as 'Вход'
 from @tab t1
 group by fio 
  ,convert(nvarchar(12),t1.dattime,104)
  ,t1.dattime

Почему так?

И еще вопрос, каким еще способом можно решить задачу (кроме варианта отдельных запросов на макс и мин через union all и pivot)?
какой предположительно наиболее эффективен при миллионном массиве?
29 мар 15, 11:33    [17446361]     Ответить | Цитировать Сообщить модератору
 Re: Max Min в оконных функциях  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
автор
максимальное и минимальное значение времени на каждую дату по каждому контрагенту


select
  t.fio,
  cast(t.dattime as date) d,
  min(t.dattime) as min_dt,
  max(t.dattime) as max_dt
from
  @tab t
group by fio, cast(t.dattime as date)
29 мар 15, 12:19    [17446462]     Ответить | Цитировать Сообщить модератору
 Re: Max Min в оконных функциях  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
все намного проще..
Спасибо churupaha
29 мар 15, 12:27    [17446472]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить