mysql - 识别连续的行

标签 mysql sql

我有一个格式如下的表格:

 cId    seq 
 ---    --- 
 A      1
 A      2
 A      4
 A      5
 B      8
 B      9
 A      12
 A      13

我想编写一个查询来生成另一个如下所示的表:

 cId    seq    consecutive
 ---    ---    -----------
 A      1      1
 A      2      1
 A      4      2
 A      5      2
 B      8      3
 B      9      3
 A      12     4
 A      13     4

我想做的是识别具有相同 cId 的连续 seq 值,然后对它们进行编号。

我想用Lag函数确定前一个seq值,然后设置连续的列,但不知道遇到下一个break时如何增加值。

SELECT [cId], 
       [Seq],
       CASE WHEN [Seq] - 1 = LAG([Seq], 1, [Seq]) OVER ( ORDER BY [Seq])  THEN 1 
       ELSE 2 END as consecutive
FROM #ConsecutiveData

此查询将在每个序列的开头旁边放置一个 2。这是我最接近的。

最佳答案

我认为作者没有使用 MySQL,因为据我所知,MySQL 中没有 LAG 函数。

以下是 MSSQL 的可能解决方案:

SELECT
    cid,
    seq,
    DENSE_RANK() OVER (ORDER BY seq - row_num) consecutive
  FROM (
    SELECT
        cid,
        seq,
        ROW_NUMBER() OVER (ORDER BY seq) row_num
      FROM
        test_table
  ) data
;

检查 SQLFiddle: SQLFiddle Example

关于mysql - 识别连续的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824509/

相关文章:

php - MySQL 中硬编码数据库字段限制和有效值

php - 如何从 phpMyadmin 中的一个表获取 ID 并将其添加到插入时的另一个表字段

mysql - 更好的做法是对所有行进行计数,还是将变量存储在表示行数的相关表中?

mysql - 与子查询相比,为什么左外连接查询会给出不同的结果?

sql - SQL可移植性有多重要?

mysql - 谁对给定文本的推文最多?

java - 如何将代码/描述扩展到复杂的对象?

php - 插入错误(PHP)

MySQL数据删除无删除级联

c# - SQL Server 中带有 IGNORE NULLS 的 Last_value