查询返回升序组号

时间:2010-05-10 15:12:58

标签: sql oracle

我有一个类似下面的查询,其中包含组(COL1)和该组的值(COL2)。

select col1,
       col2
  from (select 'A' col1, 1 col2 from dual union all
        select 'A' col1, 2 col2 from dual union all
        select 'B' col1, 1 col2 from dual union all
        select 'B' col1, 2 col2 from dual union all
        select 'C' col1, 1 col2 from dual union all
        select 'C' col1, 2 col2 from dual
       )
order by col1,
         col2;

此查询的输出如下所示:

COL1 COL2
---- ----
A    1
A    2
B    1
B    2
C    1
C    2

我需要的是一个查询,它将为每个不同的组(COL1)返回一个有序数字。似乎有一种简单的方法可以实现这一目标(可能使用分析),但由于某种原因,它正在逃避我。

GRPNUM COL1 COL2
------ ---- ----
1      A    1
1      A    2
2      B    1
2      B    2
3      C    1
3      C    2

我正在运行Oracle 10gR2。

3 个答案:

答案 0 :(得分:3)

这将有效:

SQL> WITH qry AS (
  2       select 'A' col1, 1 col2 from dual union all
  3       select 'A' col1, 2 col2 from dual union all
  4       select 'B' col1, 1 col2 from dual union all
  5       select 'B' col1, 2 col2 from dual union all
  6       select 'C' col1, 1 col2 from dual union all
  7       select 'C' col1, 2 col2 from dual
  8  )
  9  SELECT dense_rank() over (ORDER BY col1) grpnum,
 10         col1,
 11         col2
 12    FROM qry
 13   ORDER BY col1, col2;

    GRPNUM COL1       COL2
---------- ---- ----------
         1 A             1
         1 A             2
         2 B             1
         2 B             2
         3 C             1
         3 C             2

答案 1 :(得分:1)

尝试DENSE_RANK。

select DENSE_RANK() OVER(partition by col2 order by col1, col2) as GRPNUM, 
       COL1, COL2
from ....

对于给定的数据,这可行,但我不知道它是否适用于真实数据集。

答案 2 :(得分:0)

我没有Oracle方便,所以可能会有一些方言问题,但是如何做到这样:从“distinct col1”创建一个临时表,为它分配序列号,然后加入这个。类似的东西:

create sequence groupnumber;

create temp_group (grpnum int, col1 varchar(20), col2 varchar(20));

insert into temp_group
select next_val('groupnumber'), col1
from
(select distinct col1 from incoming
order by col1);

select grpnum, col1, col2
from incoming
join temp_group using (col1)
order by col1, col2;

(您可以使用oracle rownumber而不是序列。)