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

Откуда: г. Кострома
Сообщений: 274
Добрый день!

Возникла потребность сгруппировать/отфильтрова данные

declare @A table (userid int, Channel1_Date datetime, type1_id int, Channel2_Date datetime, type2_id int,	profile_id int)

insert @A values(345,	'2019-01-23 00:00',	1,	'2018-10-19 13:30',	2,	435)
insert @A values(345,	'2018-10-25 13:30',	3,	'2019-01-25 00:00',	4,	750)
insert @A values(345,	'2018-10-22 13:30',	2,	NULL,	NULL,	NULL)
insert @A values(23,	'2019-01-26 00:00',	2,	'2019-01-25 00:00',	1,	223)
insert @A values(23,	'2019-01-27 00:00',	1,	NULL,	NULL,	NULL)
insert @A values(23,	NULL,	NULL,	'2019-01-23 00:00',	3,	224)

select * from @A  

результатом должно стать группировка по userid, и выборка самых первых дат отправки по каналу 1 и каналу 2, с сохранением атрибутов соответствующих данному каналу
для Channel1_Date атрибут type1_id
для Channel2_Date атрибут type2_id и profile_id

userid	Channel1_Date	             type1_id	Channel2_Date	             type2_id	profile_id
345,	2018-10-22 13:30:00.000,	2,	2018-10-19 13:30:00.000,	2,	435
23,	2019-01-26 00:00:00.000,	2,	2019-01-23 00:00:00.000,	3,	224

Подскажите, кто сталкивался с подобной задачей, как сделать такую выборку.
4 мар 19, 09:46    [21824064]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без агригации других полей  [new]
aleks222
Member

Откуда:
Сообщений: 851
Так-то row_number()

Но можно тряхнуть стариной
select * from @A as a
           where Channel1_Date = ( select top(1) Channel1_Date from @A as x where x.userid = a.userid order by Channel1_Date desc )
4 мар 19, 09:54    [21824070]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без агригации других полей  [new]
Garfish
Member

Откуда: г. Кострома
Сообщений: 274
aleks222, такая схема не сработает, может появиться несколько одинаковых дат,
Пытаюсь через row_number() , но еще не получатся

select  *
from @A a
order by row_number() over(partition by a.userid order by a.Channel1_Date)
4 мар 19, 10:00    [21824073]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без агригации других полей  [new]
aleks222
Member

Откуда:
Сообщений: 851
Garfish
aleks222, такая схема не сработает, может появиться несколько одинаковых дат,
Пытаюсь через row_number() , но еще не получатся

select  *
from @A a
order by row_number() over(partition by a.userid order by a.Channel1_Date)


А чем одна одинаковая дата хуже другой одинаковой даты?
Как только ты определишься - все заработает.
4 мар 19, 10:07    [21824078]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без агригации других полей  [new]
Garfish
Member

Откуда: г. Кострома
Сообщений: 274
aleks222, будет задвоение данных, под условие попадут две даты
потом надо вывести по двум источникам
Channel1_Date, type1_id
Channel2_Date, type1_id, profile_id
4 мар 19, 10:23    [21824093]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без агригации других полей  [new]
Garfish
Member

Откуда: г. Кострома
Сообщений: 274
aleks222, получилось примерно так

select top 1 with ties a.userid , a.Channel1_Date , a.type1_id, b.Channel2_Date , b.type2_id ,	b.profile_id
from @A a left join @A b on (a.userid=b.userid)
where a.Channel1_Date is not null and b.Channel2_Date is not null
order by row_number() over(partition by a.userid order by a.Channel1_Date asc, b.Channel2_Date asc)
4 мар 19, 10:30    [21824101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить