列 mysql 中的组序列值

Group sequence value in column mysql

Table mytbl 有两列:col_1 & col_2。我想将 col_1 中的值范围分组为单个 col_2 值。

示例:

col_1 col_2
1 3
2 1
3 3
4 3
5 2
7 3
8 3
9 3
10 1

我想过滤掉 col_2 = 3 的范围。

当没有范围时,end 值显示 hiphen(-)。

结果:

start end col_2
1 - 3
3 4 3
7 9 3

这是一个缺口和孤岛问题。这是一种使用行号之间的差异来识别组的方法:

select 
    min(col_1) as start_col_1, 
    case when max(col_1) <> min(col_1) then max(col_1) end as end_col_1, 
    col2
from (
    select t.*,
        row_number() over(partition by col2 order by col_1) as rn
    from mytable t
) t
where col_2 = 3
group by col2, col_1 - rn
order by start_col1

这 returns null 而不是 '-' 当岛屿仅由一个记录组成时(那是因为后者不是有效数字)。

只要 col_1 无间隙递增,此方法就有效。否则,我们可以用另一个 row_number():

生成我们自己的序列
select 
    min(col_1) as start_col_1, 
    case when max(col_1) <> min(col_1) then max(col_1) end as end_col_1, 
    col2
from (
    select t.*,
        row_number() over(order by col_1) as rn1,
        row_number() over(partition by col2 order by col_1) as rn2
    from mytable t
) t
where col_2 = 3
group by col2, rn1 - rn2
order by start_col1