Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 找到值随group by更改前的行数_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql 找到值随group by更改前的行数

Sql 找到值随group by更改前的行数,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我有一张这样的桌子 CREATE TABLE Levels ([userid] int, [counter1] int, [counter2] int, [date] datetime) ; 计数器2是一个增量值。日期只是创建行的日期时间。计数器1是一个可以接受不同整数值的字段。用户id是用户的id 这是一个数据示例。您可以在中找到两个用户的更大示例 我试图做的是计算计数器1在改变之前具有相同值的次数。为什么我在stackoverflow中发现的其他问题不起作用 counter1字段可

我有一张这样的桌子

CREATE TABLE Levels
    ([userid] int, [counter1] int, [counter2] int, [date] datetime)
;
计数器2是一个增量值。日期只是创建行的日期时间。计数器1是一个可以接受不同整数值的字段。用户id是用户的id

这是一个数据示例。您可以在中找到两个用户的更大示例

我试图做的是计算计数器1在改变之前具有相同值的次数。为什么我在stackoverflow中发现的其他问题不起作用

counter1字段可以在以后多次获得相同的值,我不想将其计算为相同的情况。 我在SQL Server 2008中工作,滞后功能不可用 sqlfiddle中完整示例的预期结果是

| userid | counter1 | count |
|--------|----------|-------|
|     123|         6|      3|
|     123|         5|      5|
|     123|         4|      3|
|     123|         3|      2|
|     123|         4|      1|
|     123|         5|      1|
|     123|         6|      2|
|     123|         5|      5|
|     123|         4|      2|
|     123|         5|      1|
|     123|         4|      5|
|     123|         5|      5|
|     345|         6|      2|
|     345|         6|      9|

这是一种缺口和孤岛问题。幸运的是,您可以使用行号的差异:

select userid, counter1, count(*)
from (select t.*,
             row_number() over (partition by userid order by counter2) as seqnum,
             row_number() over (partition by userid, counter1 order by counter2) as seqnum_2
      from t
     ) t
group by userid, counter1, (seqnum - seqnum_2)
order by userid, min(counter2);
注意:这假设订购基于计数器2。如果它确实基于日期,那么您可以使用该列

为什么这样做有点难解释。但是,如果您查看子查询的结果,您将看到当counter1在相邻行上具有相同的值时,两个行号值之间的差异是如何保持不变的。

在这里您实际上不需要超前和滞后,但是,获得支持的SQL Server版本,其中滞后和超前是可用的应该是优先考虑的

以你的桌子为例 挑选* 根据值123,6,42,CONVERTdatetime20,'2010-07-31T00:12:28Z', CONVERTdatetime20,'2010-11-20T00:11:15Z', CONVERTdatetime20,'2011-03-12T00:15:07Z', CONVERTdatetime20,'2011-07-02T01:11:09Z', 12,5,46,CONVERTdatetime20,'2011-10-22T00:24:18Z', CONVERTdatetime20,'2012-02-10T23:51:54Z', CONVERTdatetime20,'2012-06-01T23:43:26Z', CONVERTdatetime20,'2012-09-21T23:43:59Z', CONVERTdatetime20,'2013-01-11T23:52:43Z', CONVERTdatetime20,'2013-05-03T23:49:25Z', CONVERTdatetime20,'2013-08-23T23:48:24Z', CONVERTdatetime20,'2013-12-14T00:01:20Z', CONVERTdatetime20,'2014-04-04T23:45:45Z', 12,4,55,CONVERTdatetime20,'2014-07-25T23:44:34Z', 2014-11-14T23:46:11Z'Vuserid,计数器1,计数器2,日期, Grps AS 选择userid, 计数器1, 第二, 日期 按用户ID按[date]排序的分区上的行数- 按用户ID划分的分区上的行数,按[date]按Grp排序 从你的桌子上 选择userid, 计数器1, 计数* 来自Grps 按用户ID分组, 计数器1, 玻璃钢;
你为什么使用不受支持的软件?这不是我的决定:@gordonlinoff这是有效的。我需要等几分钟才能接受答案。多谢各位
select userid, counter1, count(*)
from (select t.*,
             row_number() over (partition by userid order by counter2) as seqnum,
             row_number() over (partition by userid, counter1 order by counter2) as seqnum_2
      from t
     ) t
group by userid, counter1, (seqnum - seqnum_2)
order by userid, min(counter2);