sql - 如何使用sql获取最大连续行数

标签 sql sql-server sql-server-2012

我有一个 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/

相关文章:

c# - 从 SQL Server 2012 获取数据集时,在偏移附近出现不正确的语法错误

php - 如何在 SQL、Codeigniter 中的一个查询中设置不同的限制不同列?

python - mysql数据库优先级顺序

sql - 如何在 SSMS 2012 中创建 UNIQUE 约束

c# - 使用 SqlConnection.GetSchema 仅获取表(无 View )

windows-7 - 安装和创建 SQL Server 2012 实例

sql - Postgres - 将耗时转换为 HH :MM:SS format

php - 如何获取搜索查询中具有日期范围和搜索字段(例如 '%xyz%' )的记录?

c# - 在c#中执行SQL查询时出错,手动输入时没有错误

sql-server - ACOS 函数的 SQL 2012 错误