Sql 有没有办法分配';组id';按连续行的开始和结束?
我正在尝试为用户的连续行创建一个组。我试过几种不同的选择。我得到的最接近的方法是将日期时间四舍五入到最接近的30分钟,并使用如下密集排序 作为分组的密集(按用户id、dateTimeRoundNear排序) 虽然这让我很接近,但我相信必须有一个更准确的方法来做到这一点。下面是数据,最后一列,所需的组是我正在寻找的输出。非常感谢您的帮助 理想情况下,我希望按用户id和事件顺序创建组id,以便按用户id创建的每个连续组都将获得一个id 用户| id |事件|顺序|所需|组Sql 有没有办法分配';组id';按连续行的开始和结束?,sql,sql-server,Sql,Sql Server,我正在尝试为用户的连续行创建一个组。我试过几种不同的选择。我得到的最接近的方法是将日期时间四舍五入到最接近的30分钟,并使用如下密集排序 作为分组的密集(按用户id、dateTimeRoundNear排序) 虽然这让我很接近,但我相信必须有一个更准确的方法来做到这一点。下面是数据,最后一列,所需的组是我正在寻找的输出。非常感谢您的帮助 理想情况下,我希望按用户id和事件顺序创建组id,以便按用户id创建的每个连续组都将获得一个id 用户| id |事件|顺序|所需|组 三十一 XX1 2 1
三十一
XX1 2 1
XX1 3 1
XX1 1 2
XX1 2 2
XX1 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;
这回答了问题的原始版本 据我所知,您的最后一列是使用“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;
适当的专栏将是伟大的!我听到了,伙计。我是新来的,正在努力想办法!请解释您要明确实施的规则。不要让人们试图从数据中猜测。尝试使用row_number()代替密集排名。Row_number只根据您指定的内容进行分区,dense_rank()将根据唯一性进行分区。因此,规则是,当事件顺序感谢响应时,列事件顺序是系统中事件应如何发生的顺序。不应考虑事件类型。实际上,任何时候数字被破坏,然后开始一个新的组id。例如,用户id是xxxxxx,他有1,2,3/2,3/2,/1。以“/”分隔的每个项目都应该是一个组。