找到具有相同列值的连续行范围

时间:2014-08-12 09:19:25

标签: sqlite

我有一个 e 表,增加了主键。其中一个示例行如下所示:

id | name | year | info
3  | a    | 1    | any
5  | a    | 1    | any
6  | a    | 1    | any
7  | b    | 3    | any
9  | b    | 3    | any
10 | a    | 3    | any
11 | a    | 1    | any

我希望所有连续行从最小行开始具有相同的名称&年份值作为最小行(ID 3)。 限制是我需要使用一个SELECT语句获得结果。

所以在这个例子中,结果应该是3,5,6:

3 | a | 1 | any
5 | a | 1 | any
6 | a | 1 | any

如果我们删除这三行并再次查询,我们应该得到7,9:

7 | b | 3 | any
9 | b | 3 | any

这是我当前的查询,但不起作用。我是SQL新手想知道如何简化这个?

SELECT * 
FROM e AS E1, 
     (SELECT name, year FROM e WHERE id = (SELECT min(id) FROM e)) AS M1 
WHERE 
     E1.name = M1.name AND 
     E1.year = M1.year AND 
     E1.id < (SELECT min(id) 
              FROM e AS E2 
              WHERE E2.name != M1.name OR E2.year != M1.year)

1 个答案:

答案 0 :(得分:1)

SELECT *
FROM e
WHERE /* id > last_id_from_previous_result AND */
      id < COALESCE((SELECT min(e.id)
                     FROM e
                     JOIN (SELECT id, name, year
                           FROM e
                           /* WHERE id > last_id_from_previous_result */
                           ORDER BY id
                           LIMIT 1) AS first
                       ON /* e.id > first.id AND */
                          (e.name != first.name OR
                           e.year != first.year)),
                    'infinite')

最里面的查询搜索要返回的第一个ID。

中间查询搜索不属于结果的第一行,即具有较大ID的第一行具有不同的nameyear。 在表的末尾,结果是NULL;然后COALESCE返回一个大于任何数字的值。

最外面的查询然后返回该行之前的所有行。

如果您不想删除所有以前的行,可以添加注释掉的检查以在上一个查询的最后一个ID之后继续。 (开头时,请使用小于所有ID的值,例如-1。)