我有一张桌子,我希望将在col2处最多x差异的行分组。 例如,
col1 col2
abg 3
abw 4
abc 5
abd 6
abe 20
abf 21
在查询之后我想要获得
这样的组group 1: abg 3
abw 4
abc 5
abd 6
group 2: abe 20
abf 21
在此示例中差异为1。
怎么写这样的查询?
答案 0 :(得分:4)
对于Oracle(或支持窗口函数的任何东西),这将起作用:
select col1, col2, sum(group_gen) over (order by col2) as grp
from (
select col1, col2,
case when col2 - lag(col2) over (order by col2) > 1 then 1 else 0 end as group_gen
from some_table
)
在SQLFiddle上查看。
答案 1 :(得分:1)
这应该得到你所需要的,并将差距改为5,或者任何其他数字是@lastVal +1的单一变化(与其他差异相比)。需要预先查询“PreSorted”以确保按顺序处理数据,这样就不会出现无序条目。
当处理每个当前行时,它的第2列值存储在@lastVal中,用于下一行的测试比较,但仍保留为有效列“Col2”。没有“分组依据”,因为您只想要一个列来标识每个组与任何聚合相关联的位置。
select
@grp := if( PreSorted.col2 > @lastVal +1, @grp +1, @grp ) as GapGroup,
PreSorted.col1,
@lastVal := PreSorted.col2 as Col2
from
( select
YT.col1,
YT.col2
from
YourTable YT
order by
YT.col2 ) PreSorted,
( select @grp := 1,
@lastVal := -1 ) sqlvars
答案 2 :(得分:0)
尝试此查询,您可以使用1和2作为输入并获取组:
var grp number(5)
exec :grp :=1
select * from YourTABLE
where (:grp = 1 and col2 < 20) or (:grp = 2 and col2 > 6);