【问题标题】:SQL check adjacent rows for sequenceSQL 检查相邻行的顺序
【发布时间】:2010-09-21 04:20:10
【问题描述】:

我有一个表,其中有一个 id 列(唯一的、主要的)、一个名称(不是唯一的——事实上,很可能是重复的)和一个值为 0、1 或 2 的标志列。假设我重新排序使用命令的表

SELECT id, name, flag ORDER BY name, id

我想使用 SQL 生成一个名称列表,其中,当向下读取重新排序中的行时,有两个相邻的行具有相同的名称和值 0 和 1 的标志(按该顺序)。此外,在该列表中,我想知道发生这种情况的两行的 ID。如果发生不止一次,应该有多行。

所以,例如,在下面

id name flag
4  Bob  0
5  Bob  2
6  Bob  1
1  Cathy  0
7  Cathy  1
3  David  0
2  Elvis  2
8  Elvis  0
9  Elvis  1

我想选择

name id1 id2
Cathy 1 7
Elvis 8 9

我该怎么做?

我正在使用 MySQL。

编辑:请注意,这些相邻行的 ID 可能不连续;如果我们按名称订购,它们只是连续的。例如,参见 Cathy。

谢谢!

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试

    select t1.name, t1.id as id1,t2.id as id2 
    from tablename t1, tablename  t2 
    where t1.flag = 0 and t2.id = t1.id+1 and t2.flag = 1 and t1.name = t2.name
    

    【讨论】:

    • t1 和 t2 不应该也按名称链接吗?
    • @Mark Ba​​nnister:是的,你是对的。感谢提及
    • 谢谢,我不知道你可以像这样从一个表中多次选择。但是,您编写的代码并不能完全解决问题,因为 id 不一定是连续的,只有当我们按名称排序时它们才是连续的。我澄清了我的例子,试图让这一点更加明显。
    • 不是直接从 t1 中选择,而是构建一个按顺序对 t1 的行进行编号的查询,然后将其用作内联视图或公用表表达式,并在其上使用 Yogesh 的逻辑 - 那里,相邻的行有连续的数字。
    【解决方案2】:

    试试:

    select t1.name, t1.id as id1,t2.id as id2 
    from tablename t1
    join tablename t2 
    on t2.name = t1.name and t2.flag = t1.flag + 1 and t2.id = 
        (select min(t3.id) from tablename t3
         where t1.name = t3.name and t1.id < t3.id)
    

    编辑:修改了对 t2 的连接以包括对子查询的查找

    【讨论】:

    • 与 Yogesh 的评论相同... id 不一定是连续的。我需要做一个临时表吗?
    猜你喜欢
    • 2018-01-17
    • 2017-12-31
    • 1970-01-01
    • 2014-08-04
    • 2017-03-14
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多