Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有办法分配';组id';按连续行的开始和结束?_Sql_Sql Server - Fatal编程技术网

Sql 有没有办法分配';组id';按连续行的开始和结束?

Sql 有没有办法分配';组id';按连续行的开始和结束?,sql,sql-server,Sql,Sql Server,我正在尝试为用户的连续行创建一个组。我试过几种不同的选择。我得到的最接近的方法是将日期时间四舍五入到最接近的30分钟,并使用如下密集排序 作为分组的密集(按用户id、dateTimeRoundNear排序) 虽然这让我很接近,但我相信必须有一个更准确的方法来做到这一点。下面是数据,最后一列,所需的组是我正在寻找的输出。非常感谢您的帮助 理想情况下,我希望按用户id和事件顺序创建组id,以便按用户id创建的每个连续组都将获得一个id 用户| id |事件|顺序|所需|组 三十一 XX1 2 1

我正在尝试为用户的连续行创建一个组。我试过几种不同的选择。我得到的最接近的方法是将日期时间四舍五入到最接近的30分钟,并使用如下密集排序

作为分组的密集(按用户id、dateTimeRoundNear排序) 虽然这让我很接近,但我相信必须有一个更准确的方法来做到这一点。下面是数据,最后一列,所需的组是我正在寻找的输出。非常感谢您的帮助

理想情况下,我希望按用户id和事件顺序创建组id,以便按用户id创建的每个连续组都将获得一个id

用户| id |事件|顺序|所需|组
三十一
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。以“/”分隔的每个项目都应该是一个组。