Sql 按组对连续重复的值进行计数
我在这个网站上搜索了一下,想找到一个解决这个问题的方法,但一直找不到一个完全符合我所寻找的答案。我试图为每个ID编号计数连续的重复值,按日期排序。我当前的表类似于下表的前3列,而我想添加的第四列Sql 按组对连续重复的值进行计数,sql,duplicates,teradata,Sql,Duplicates,Teradata,我在这个网站上搜索了一下,想找到一个解决这个问题的方法,但一直找不到一个完全符合我所寻找的答案。我试图为每个ID编号计数连续的重复值,按日期排序。我当前的表类似于下表的前3列,而我想添加的第四列 ID | date | value | consec_duplicates 1 1/1 1 0 1 1/2 2 0 1 1/3 2 1 1 1/4
ID | date | value | consec_duplicates
1 1/1 1 0
1 1/2 2 0
1 1/3 2 1
1 1/4 2 2
1 1/5 3 0
1 1/6 3 1
2 1/14 1 0
2 1/15 2 0
2 1/16 3 0
2 1/17 3 1
2 1/18 4 0
2 1/19 5 0
3 1/4 1 0
3 1/5 2 0
3 1/6 2 1
3 1/7 2 2
3 1/8 2 3
3 1/9 3 0
有人知道如何建造第四个专栏吗?谢谢 这是一个缺口和孤岛问题。一种方法是区分
row\u number()
s来识别组
select t.*,
dense_rank() over (partition by id order by (seqnum - seqnum_value), value) as grp,
row_number() over (partition by id, (seqnum - seqnum_value), value order by date) as grp_seqnum
from (select t.*,
row_number() over (partition by id order by date) as seqnum,
row_number() over (partition by id, value order by date) as seqnum_v
from t
) t;
这是一个有点棘手的理解你第一次看到它。如果您运行子查询并盯着结果看足够长的时间,您就会明白为什么相邻值的差异是恒定的
编辑:
我认为乔治是对的。您的数据没有重复相同的值,因此您可以执行以下操作:
select t.*,
row_number() over (partition by id, value order by date) as grp_seqnum
from t;
这是一个缺口和岛屿问题。一种方法是区分
row\u number()
s来识别组
select t.*,
dense_rank() over (partition by id order by (seqnum - seqnum_value), value) as grp,
row_number() over (partition by id, (seqnum - seqnum_value), value order by date) as grp_seqnum
from (select t.*,
row_number() over (partition by id order by date) as seqnum,
row_number() over (partition by id, value order by date) as seqnum_v
from t
) t;
这是一个有点棘手的理解你第一次看到它。如果您运行子查询并盯着结果看足够长的时间,您就会明白为什么相邻值的差异是恒定的
编辑:
我认为乔治是对的。您的数据没有重复相同的值,因此您可以执行以下操作:
select t.*,
row_number() over (partition by id, value order by date) as grp_seqnum
from t;
当这些值实际上一直在增加时,这应该会起作用:
row_number() over (partition by id, value order by date) - 1
否则,Teradata对标准SQL进行了扩展,用于以下情况:
row_number()
over (partition by id
order by date
RESET WHEN MIN(value) -- previous value not equal to current
OVER (partition by id
order by date
rows between 1 preceding and 1 preceding) <> value
) - 1
行号()
超过(按id划分)
按日期订购
当最小值(值)时重置-上一个值不等于当前值
超过(按id划分)
按日期订购
前1行和前1行之间的行)值
) - 1
当值实际上一直在增加时,这应该起作用:
row_number() over (partition by id, value order by date) - 1
否则,Teradata对标准SQL进行了扩展,用于以下情况:
row_number()
over (partition by id
order by date
RESET WHEN MIN(value) -- previous value not equal to current
OVER (partition by id
order by date
rows between 1 preceding and 1 preceding) <> value
) - 1
行号()
超过(按id划分)
按日期订购
当最小值(值)时重置-上一个值不等于当前值
超过(按id划分)
按日期订购
前1行和前1行之间的行)值
) - 1
这是一个副本吗?这个的副本?看看他的数据,我会做一个row\u number()(按id分区,按id值顺序)
这不仅适用于这个案例,戈登先生?看看他的数据,我会做一个row\u number()(按id分区,按id值顺序)
这不仅适用于这个案例,戈登先生?