我有一个 sql 谜题,除了蛮力 case 语句之外,我找不到正确的方法。希望有好的想法如何实现这一目标。谢谢你的想法。我在 sql server 2012 上。
基本上,我有几组行,每组固定 6 行,值为 1 或 0。现在,我需要在每组之后插入一个新行并填写最大 连续行数 用于该组。见下文:
group_name, row_number, yes_no
A, 1, 1
A, 2, 0
A, 3, 1
A, 4, 1
A, 5, 1
A, 6, 0
B, 1, 1
B, 2, 1
B, 3, 0
B, 4, 1
B, 5, 0
B, 6, 0
现在我希望结果是:
group_name, row_number, yes_no
A, 1, 1
A, 2, 0
A, 3, 1
A, 4, 1
A, 5, 1
A, 6, 0
**A, 7, 3**
B, 1, 1
B, 2, 1
B, 3, 0
B, 4, 1
B, 5, 0
B, 6, 0
**B, 7, 2**
notice row_number 7 是一个新行,最大连续行数为 1。知道怎么做吗?谢谢!
最佳答案
您可以通过从 row_number
中减去一个序列号并分配一个组来获得最大连续行数。例如,以下获取有关数据中所有连续值的信息:
select group_name, yes_no, min(row_number), max(row_number), count(*)
from (select t.*,
(row_number - row_number() over (partition by group_name, yes_no
order by row_number)
) as grp
from table t
) t
group by group_name, grp, yes_no;
要得到你想要的,你需要一个 insert
和一个更高级别的聚合——以获得最大计数:
insert into table(group_name, row_number, yes_no)
select group_name, maxrn + 1, max(cnt)
from (select group_name, yes_no, count(*) as cnt, max(row_number) as maxrn
from (select t.*,
(row_number - row_number() over (partition by group_name, yes_no
order by row_number)
) as grp
from table t
) t
group by group_name, grp, yes_no
) t
group by group_name
) t
注意:您的问题不清楚您是想要最长的 1 和 0 组还是仅 1 组。这两者兼而有之。如果你只想要 1,你可以在最后一个 group by
之前插入一个 where
子句。
关于sql - 如何使用sql获取最大连续行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29478089/