我有一个 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)
答案 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的第一行具有不同的name
或year
。
在表的末尾,结果是NULL;然后COALESCE返回一个大于任何数字的值。
最外面的查询然后返回该行之前的所有行。
如果您不想删除所有以前的行,可以添加注释掉的检查以在上一个查询的最后一个ID之后继续。 (开头时,请使用小于所有ID的值,例如-1
。)