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

Откуда:
Сообщений: 336
есть таблица и данные:
declare @t table (f1 int not null, f2 int not null, f3 int not null, d1 date not null, d2 date)
insert into @t values
(1, 2, 3, '2010-01-01', null),
(1, 2, 3, '2011-01-01', '2011-02-01'),
(1, 2, 3, '2012-01-01', null),
(1, 2, 3, '2013-01-01', null),
(1, 2, 3, '2014-01-01', null),
(1, 2, 3, '2015-01-01', '2015-02-01'),

(2, 2, 3, '2010-01-01', null),
(2, 2, 3, '2009-01-01', null),
(2, 2, 3, '2015-01-01', null),
(2, 2, 3, '2014-01-01', '2014-02-01'),

Нужно сгруппировать записи по f1, f2, f3 таким образом, чтоб
d1 было минимальным - это просто
d2 из той строки, где d1 максимально
то есть на выходе должно быть:
f1   f2   f3   d1          d2
---- ---- ---- ----------- ----------- 
1    2    3    2010-01-01  2015-02-01
2    2    3    2009-01-01  null
18 сен 15, 12:47    [18165104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
18 сен 15, 12:50    [18165139]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Glory,
с утра бьюсь именно над over(), пока никак, прошу помощи
18 сен 15, 12:53    [18165164]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
=Сергей=
с утра бьюсь именно над over(),

Примеры из хелпа не пробовали разбирать ?

Сообщение было отредактировано: 18 сен 15, 12:54
18 сен 15, 12:54    [18165177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
=Сергей=
Member

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

тут сложнее диагноз - логику не могу придумать
18 сен 15, 12:56    [18165198]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT T.f1,T.f2,T.f3,T.d1,T1.d2
FROM (SELECT f1,f2,f3,MIN(d1) FROM @t GROUP BY f1,f2,f3) T(f1,f2,f3,d1)
CROSS APPLY(SELECT TOP(1) T1.d2 FROM @t T1 WHERE T1.f1=T.f1 AND T1.f2=T.f2 AND T1.f3=T.f3 ORDER BY d1 DESC) T1(d2);
или
SELECT T.f1,T.f2,T.f3,d1=MIN(T.d1),d2=MAX(T1.d2)
FROM @t T
CROSS APPLY(SELECT TOP(1) T1.d2 FROM @t T1 WHERE T1.f1=T.f1 AND T1.f2=T.f2 AND T1.f3=T.f3 ORDER BY d1 DESC) T1(d2)
GROUP BY T.f1,T.f2,T.f3;
18 сен 15, 12:58    [18165213]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
=Сергей=
Glory,

тут сложнее диагноз - логику не могу придумать

Мда, сортировать по d1 с партицированием по f1 f2 f3 ?
18 сен 15, 12:58    [18165214]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
=Сергей=,

не мудрствую лукаво, тупо в лоб:
select f1,f2,f3
     , MIN(d1) as min_d1
     , max(case rn when 1 then d2 else null end) as x_d2
 from (
        select f1, f2, f3, d1, d2, ROW_NUMBER() over(partition by f1,f2,f3 order by d1 desc) as rn
          from @t
      )v
group by f1, f2, f3
18 сен 15, 13:03    [18165266]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх,

можно немного острее, и за один проход по таблице...
18 сен 15, 13:04    [18165276]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Добрый Э - Эх,

можно немного острее, и за один проход по таблице...

схематично так:
select f1, f2, f3, min(d1) as min_d1, nullif(substring(max(d1+isnull(d2,'0000-00-00')),11,10),'0000-00-00') as x_d2
  from @t
 group by f1,f2,f3
только даты предварительно преобразовать в строки вида 'YYYY-MM-DD'
18 сен 15, 13:09    [18165314]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить