mysql 列中的组序列值
Posted
技术标签:
【中文标题】mysql 列中的组序列值【英文标题】:Group sequence value in column mysql 【发布时间】:2020-12-30 13:52:05 【问题描述】:表 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 的 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 列中的组序列值的主要内容,如果未能解决你的问题,请参考以下文章