SQL - 根据数字按数字分组

时间:2013-11-30 12:41:43

标签: sql database oracle group-by

我有一张桌子,我希望将在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。

怎么写这样的查询?

3 个答案:

答案 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);