Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 SQL SERVER根据条件生成行号_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL SERVER根据条件生成行号

Sql server 2008 SQL SERVER根据条件生成行号,sql-server-2008,Sql Server 2008,我有一个表,其中包含UserID、DIFFTIME列。当我从表中选择这些列时,我还希望有一个派生列,即:如果DiffTime大于20,我希望增加每个用户id的计数 例如,如果该表具有: User ID DIFF TIME 1 0 1 5 1 10 2 0 2 21 2 5 我想要一个类似这样的结果集: User ID DIFF TIME SESSION NUMBER 1 0

我有一个表,其中包含UserID、DIFFTIME列。当我从表中选择这些列时,我还希望有一个派生列,即:如果DiffTime大于20,我希望增加每个用户id的计数

例如,如果该表具有:

User ID DIFF TIME
 1        0
 1        5
 1        10
 2        0
 2        21
 2        5 
我想要一个类似这样的结果集:

User ID DIFF TIME SESSION NUMBER
     1        0        1
     1        5        1
     1        10       1
     2        0        1
     2        21       2
     2        5        2
我如何做到这一点

非常感谢您的想法和建议

使用以下语句:

select t1.User_Id, t1.Diff_Time, 
    isnull(count(t2.User_Id), 0) + 1 as Session_Number
from @table t1
left join @table t2 
    on t1.User_Id = t2.User_Id 
    and t1.eventTime >= t2.eventTime 
    and t2.Diff_Time > 20
group by t1.User_Id, t1.Diff_Time, t1.eventTime
order by t1.User_Id, t1.eventTime
(用实际表名替换
@table

注意:我假设您表格的第五行在
Diff\u Time
列中有值21,并且问题中有一个拼写错误,正如@AaronBertrand在评论中指出的那样使用以下语句:

select t1.User_Id, t1.Diff_Time, 
    isnull(count(t2.User_Id), 0) + 1 as Session_Number
from @table t1
left join @table t2 
    on t1.User_Id = t2.User_Id 
    and t1.eventTime >= t2.eventTime 
    and t2.Diff_Time > 20
group by t1.User_Id, t1.Diff_Time, t1.eventTime
order by t1.User_Id, t1.eventTime
(用实际表名替换
@table


注意:我假设表的第五行在
Diff\u Time
列中有值21,并且问题中有一个输入错误,正如@AaronBertrand在注释中指出的那样

这是表中仅有的两列吗?我想你还需要点别的东西来命令。查询无法判断0发生在5之前,5发生在10之前。您预期输出中的21也是一个输入错误吗?@Aaron:我的另一列是eventTime..Nope 21不是一个输入错误…如果difftime大于20,则递增计数。21代表计数?在原始数据中,20不代表时间吗?您想增加会话号还是增加时间?我在这里显然迷路了。@Aaron:如果差异时间>20,则增加会话数的计数。希望我已经说清楚了。哇,真是浪费了很多时间。现在,也许你应该重温一下你问过的58个问题中的一些,然后投票选出一两个答案?你不可能接受了超过一半的答案(仍然不是一个好的比例),但没有发现一个答案有帮助或值得投票。这个网站上满是试图帮助你的志愿者,你至少可以用你的支持票来奖励他们(这不会让你付出任何代价)。这是表格中仅有的两列吗?我想你还需要点别的东西来命令。查询无法判断0发生在5之前,5发生在10之前。您预期输出中的21也是一个输入错误吗?@Aaron:我的另一列是eventTime..Nope 21不是一个输入错误…如果difftime大于20,则递增计数。21代表计数?在原始数据中,20不代表时间吗?您想增加会话号还是增加时间?我在这里显然迷路了。@Aaron:如果差异时间>20,则增加会话数的计数。希望我已经说清楚了。哇,真是浪费了很多时间。现在,也许你应该重温一下你问过的58个问题中的一些,然后投票选出一两个答案?你不可能接受了超过一半的答案(仍然不是一个好的比例),但没有发现一个答案有帮助或值得投票。这个网站上满是试图帮助你的志愿者,你至少可以用你的支持票来奖励他们(这不会让你付出任何代价)。@AaronBertrand我认为这是一个拼写错误,正如你指出的那样。我在第五行的值为
21
的表上测试了这一点。OP刚刚评论说第一个表中的20是一个拼写错误,应该是21。据我所知,这给出了正确的结果。@AaronBertrand我认为这是一个打字错误,正如你所指出的。我在第五行的值为
21
的表上测试了这一点。OP刚刚评论说第一个表中的20是一个拼写错误,应该是21。据我所知,这给出了正确的结果。