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);