Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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 Server中创建可分组的ID(可能带有秩或行号),以通过难以捉摸的顺序交替来确定行值_Sql_.net_Sql Server_Database - Fatal编程技术网

在SQL Server中创建可分组的ID(可能带有秩或行号),以通过难以捉摸的顺序交替来确定行值

在SQL Server中创建可分组的ID(可能带有秩或行号),以通过难以捉摸的顺序交替来确定行值,sql,.net,sql-server,database,Sql,.net,Sql Server,Database,在你做出判断之前,这个问题与关于这个主题的大多数其他问题是不同的。是的,我确实想在某些行中连接文本;但是,在大多数其他情况下,对于用户希望连接的每一行,都有一个相同的ID值。在我的例子中,似乎需要创建一个ID值,但问题是难以解决的,因为我似乎无法让ROW_NUMBER()或RANK()函数以我正在寻找的方式对值进行分区 在数据中,随着ID的顺序增加,我想设置一个列值,如ROW_NUMBER(),但我想在每次SpeakerID更改时重置其计数 我有如下数据: IDConversationLine

在你做出判断之前,这个问题与关于这个主题的大多数其他问题是不同的。是的,我确实想在某些行中连接文本;但是,在大多数其他情况下,对于用户希望连接的每一行,都有一个相同的ID值。在我的例子中,似乎需要创建一个ID值,但问题是难以解决的,因为我似乎无法让ROW_NUMBER()或RANK()函数以我正在寻找的方式对值进行分区

在数据中,随着ID的顺序增加,我想设置一个列值,如ROW_NUMBER(),但我想在每次SpeakerID更改时重置其计数

我有如下数据:


IDConversationLinesPeakerNamePeakerTeacherLineiFSpeakingStudentLineiFSpeakingTeacherIDFSpeakingStudentDiFSpeakingCleanlineIDConvid1嗨!让我们再检查一下你的问题。你要我打字还是说话?罗伯茨先生299875嗨!让我们再检查一下你的问题。你想让我打字还是说话?NULL299875NULL112嗨Gabriela。。。哪款手机的屏幕面积更大?罗伯茨先生299875嗨,加布里埃拉。。。哪部手机的屏幕面积更大?NULL299875NULL213新手机对吗?Gabriela 9695521NULL9695521314新手机对吗?NULL9695521314正确。Roberts 299875正确…NULL299875NULL415由于我们可以假设形状为矩形,您需要做什么来计算任一屏幕的面积?Roberts 299875先生由于我们可以假设形状为矩形,您需要做什么来计算任一屏幕的面积?NULL299875NULL516我不知道?Gabriela 9695521NULL我不知道?NULL9695521617矩形面积=长度x宽度。Roberts 299875矩形面积=长度x宽度null299875null718以“面积差异=”开头Roberts 299875先生在清除学生答案框Mr后以“面积差异=”开头NULL299875NULL819。罗伯茨299875清除学生答案框NULL299875NULL9110后,我已经做了GABRIELA 9695521NULL我已经做了NULL9695521101
这可以通过行号差异的方法完成。(运行最内部的查询,查看具有相同说话人id的连续行如何分配给同一组)。然后获取每个组的起始id,并按顺序使用
densite\u rank
获取所需的聊天id

select t.*,dense_rank() over(order by id_strt) as chat_id
from (select t.*,min(id) over(partition by grp,speakerid) as id_strt
      from (select t.*
            ,row_number() over(order by id)-row_number() over(partition by speakerid order by id) as grp
            from t
           ) t
     ) t

如果您只需要chat_id来标识组和连接值,最内部的查询就足够了。当您按分组时,只需按grp、speakerid分组即可,这可以通过行号差异的方法完成。(运行最内部的查询,查看具有相同说话人id的连续行如何分配给同一组)。然后获取每个组的起始id,并按顺序使用
densite\u rank
获取所需的聊天id

select t.*,dense_rank() over(order by id_strt) as chat_id
from (select t.*,min(id) over(partition by grp,speakerid) as id_strt
      from (select t.*
            ,row_number() over(order by id)-row_number() over(partition by speakerid order by id) as grp
            from t
           ) t
     ) t

如果您只需要chat_id来标识组和连接值,最内部的查询就足够了。当您按分组时,只需按grp、speakerid分组即可,您可以使用lead和windowing sum来实现这一点:

select *, ChatId = sum(case when speakerid <> NextSpeakerid then 1 else 0 end) over(order by id)+1 from (
    select *, NextSpeakerid = lag(speakerid, 1, null) over(order by id) from #yourgroup
) a
您的桌子:

create table #yourgroup (ID int identity(1,1), speakername varchar(20), speakerid int)

insert into #yourgroup ( speakername, speakerid) values
 ('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )

您可以使用lead和windowing sum来实现这一点:

select *, ChatId = sum(case when speakerid <> NextSpeakerid then 1 else 0 end) over(order by id)+1 from (
    select *, NextSpeakerid = lag(speakerid, 1, null) over(order by id) from #yourgroup
) a
您的桌子:

create table #yourgroup (ID int identity(1,1), speakername varchar(20), speakerid int)

insert into #yourgroup ( speakername, speakerid) values
 ('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Mr. Roberts  ', 25239875 )
,('Gabriela     ', 19645521 )


您能以表格格式发布输入和输出吗?当然,请稍等。@vkp更好吗?是的,更好得多。我运行了前面的代码段,理解了您要查找的内容。您能以表格格式发布输入和输出吗?当然,请稍等。@vkp是否更好?是的。好得多。我运行了前面的代码片段,理解了您要查找的内容。我欣赏这种方法的简单性,但这种方法比@vkp的方法慢5倍多,可能是由于求和运算。从技术上讲,它不应该慢。你能发布执行计划吗?所以我们可以进一步检查..我编辑了我的帖子,加入了查询执行计划的图片。你们能试着在同一批中执行这两个查询吗?在我的91%查询中,它本身就进行了聚集索引扫描……知道我为什么会得到这些结果吗?我欣赏这种方法的简单性,但这种方法比@vkp的方法慢5倍多,可能是由于求和运算。从技术上讲,它不应该慢。你能发布执行计划吗?所以我们可以进一步检查..我编辑了我的帖子,加入了查询执行计划的图片。你们能试着在同一批中执行这两个查询吗?在我的查询中,91%的结果是聚集索引扫描本身…知道我为什么会得到这些结果吗?这是一个非常快速的解决方案!仅供参考,我需要对其进行编辑,以便在两个PARTITION BY子句的末尾都包含convID,如:(PARTITION BY grp,speakerid,convID)和(PARTITION BY speakerid,convID ORDER BY ID)。否则,如果对话发生变化,但同一发言者仍在讲话(例如,与另一个人讲话),则不会提供新的聊天id。@devinbost。。因为这个问题只显示了一个convID,我不确定是否包含它。根据你说的,你应该包含它,而且你已经这样做了。这是一个非常快速的解决方案!仅供参考,我需要对其进行编辑,以便在两个PARTITION BY子句的末尾都包含convID,如:(PARTITION BY grp,speakerid,convID)和(PARTITION BY speakerid,convID ORDER BY ID)。否则,如果对话发生变化,但同一发言者仍在讲话(例如,与另一个人讲话),则不会提供新的聊天id。@devinbost。。因为这个问题只显示了一个convID,我不确定是否包括它。根据你说的,你应该包括它,而且你已经这样做了。。