我们说我有这样一张桌子:
id col1 col2
---------------------
1 35 A
2 40 B
3 39 B
4 39 B
5 39 B
6 40 B
7 39 B
8 39 B
9 40 B
10 40 C
11 35 C
如何制作它,使其具有如下结果:
id col1 col2
---------------------
1 35 A
2 40 B
3 39 B
6 40 B
7 39 B
9 40 B
10 40 C
11 35 C
我希望group by
col1
在相邻行中具有相同的值,同时在col2
col1
中的id:9
值id:10
和{{ 1}}无法分组,因为它具有不同的col2
值)
任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
关键思想是获取相邻行的分组标识符。问题是:对于应该组合在一起的行,行的哪些特性是常量?
嗯,这里有一个:id
或col1
中具有不同值的前一行(基于col2
)对于组中的所有行都是相同的。
您可以将此观察值转换为每行的度量(使用相关子查询)。其余的只是聚合:
select min(id) as id col1, col2, count(*) as NumInGroup
from (select t.*,
(select count(*)
from t t2
where t2.id < t.id and (t2.col1 <> t.col1 or t2.col2 <> t.col2)
) as grp
from t
) t
group by grp, col1, col2;
注意:这对少量数据运行良好,但不能很好地扩展。