我有这张桌子:
name value
-------------
nameA 1
nameA 2
nameA 3
nameB 4
nameB 5
nameB 6
nameA 7
nameA 8
需要这个结果:
name startvalue endvalue
--------------------------
nameA 1 3
nameB 4 6
nameA 7 8
答案 0 :(得分:3)
这称为间隙和岛屿问题。你可以用不同的行号来解决它:
select name, min(value), max(value)
from (select t.*,
row_number() over (order by value) as seqnum,
row_number() over (partition by name order by value) as seqnum_n
from t
) t
group by name, (seqnum - seqnum_n);
行号的不同之处在于找到相同的相邻名称。为什么这个工作有点难以解释。但是,如果查看子查询的结果,您将看到差异如何标识具有相同名称的相邻行。