Есть ли способ назначить «идентификатор группы» по началу и концу последовательных строк? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать группу для последовательных строк пользователем. Я пробовал несколько разных вариантов. Самое близкое, что я получил, - это округление даты и времени до ближайших 30 минут и использование плотного ранга следующим образом:

DENSE_RANK () over (order by user_id, dateTimeRoundNear) в качестве группировки, в то время как это приближает меня, я верю, что тамдолжен быть более точным способом сделать это. Данные приведены ниже, последний столбец требуемая группа - это вывод, который я ищу. Любая помощь очень ценится!

В идеале я хотел бы создать идентификаторы групп по user_id и event_order, чтобы каждая последовательная группа по user_id получала идентификатор

user_id |event_order |требуемая группа
xxxx1 1 1
xxxx1 2 1
xxxx1 3 1
xxxx1 1 2
xxxx1 2 2
xxxx1 2 3

Обновление: пожалуйста, используйте приведенный ниже скрипт для создания набора данных. В идеале мы могли бы программно имитировать столбец требуемой группы.

create table #test
(ID integer,
user_id integer,
SendDate datetime,
event_type varchar(255),
event_order integer,
dateTimeRoundNear datetime,
grouping integer,
desired_group integer
);

insert into #test
(ID, user_id, SendDate, event_type, event_order, dateTimeRoundNear, grouping, desired_group)
values
(13329832,  125440, '20190927 01:07:18 AM', 'pwsent',   1,  '20190927 01:00:00 AM', 1,  1),
(13329832,  125440, '20190927 01:07:18 AM', 'pwchange', 2,  '20190927 01:00:00 AM', 1,  1),
(13330033,  125440, '20190927 01:08:22 AM', 'pwreset', 3,   '20190927 01:00:00 AM', 1, 1),
(13331789,  12992,  '20190927 01:15:10 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 13, 2),
(13331790,  12992,  '20190927 01:15:10 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 13, 2),
(13332009,  12992,  '20190927 01:16:20 AM', 'pwreset',  3,  '20190927 01:30:00 AM', 13, 2),
(13332719,  128016, '20190927 01:20:37 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 9,  3),
(13332720,  128016, '20190927 01:20:37 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 9,  3),
(13332857,  128016, '20190927 01:21:23 AM', 'pwreset',  3,  '20190927 01:30:00 AM', 9,  3),
(13334671,  128016, '20190927 01:31:24 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 9,  4),
(13334672,  128016, '20190927 01:31:24 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 9,  4),
(13334713,  128016, '20190927 01:31:34 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 9,  5),
(13334714,  128016, '20190927 01:31:34 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 9,  5),
(13334898,  149296, '20190927 01:32:34 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 25, 6),
(13334899,  149296, '20190927 01:32:34 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 25, 6),
(13334978,  128016, '20190927 01:32:42 AM', 'pwsent',   1,  '20190927 01:30:00 AM', 9,  7),
(13334980,  128016, '20190927 01:32:42 AM', 'pwchange', 2,  '20190927 01:30:00 AM', 9,  7),
(13348681,  201264, '20190927 03:59:09 AM', 'pwchange', 2,  '20190927 04:00:00 AM', 68, 8),
(13376580,  317408, '20190927 09:54:03 AM', 'pwchange', 2,  '20190927 10:00:00 AM', 108,9);
select 
*
from #test;

снимок экрана набора данных

1 Ответ

0 голосов
/ 18 октября 2019

Это отвечает первоначальной версии вопроса.

Ваш последний столбец перечисляет строки с "pwchange", насколько я могу судить.

Это будет:

select t.*,
       (case when event_type = 'pwchange'
             then row_number() over (partition by event_type order by senddate)
        end) as final_group
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...