mysql 列中的组序列值

Posted

技术标签:

【中文标题】mysql 列中的组序列值【英文标题】:Group sequence value in column mysql 【发布时间】:2020-12-30 13:52:05 【问题描述】:

mytbl 有两列:col_1col_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 的 a 范围。

当没有范围时,它会为 end 值显示 hihen(-)。

结果:

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

【问题讨论】:

【参考方案1】:

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

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

当岛屿仅由一条记录组成时(因为后者不是有效数字),这将返回 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

【讨论】:

我正在用大量数据对其进行测试。第二个工作正常,但我想在 where 子句中添加另一个条件(如果可能有帮助,实际上按日期过滤)

以上是关于mysql 列中的组序列值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL更新列的序列号按具有相同值的字段分组

获取表列中序列值的范围

如何在具有唯一键和序列值的列中唯一求和

对 pandas 数据框中的连续值进行分组

使用前导功能检测蜂巢列中的序列

从列中的最大 id 创建 HSQL 序列