row_number或排名相似的数据

时间:2014-05-17 03:17:50

标签: sql oracle

我有一张这样的表:

col1    col2
A        A
A        A
A        F
B        B
B        B
B        H
C        L
A        A
A        A
A        A
A        E
C        C
C        C
C        C
C        C
C        C
C        J

我想要这样的结果:

col1     count
A         3
B         3
C         1
A         4
C         6

如果col1<> col2 reset count ...但我只想要sql代码而不是pl-sql等。

也许row_number()结束(RESET WHEN col1<> col2)。

请帮帮我。

好的朋友谢谢你。抱歉我的英语不好。

事实上我的桌子是这样的:

id      col1    col2
1000     A        A
2000     A        A
3000     A        F
4000     B        B
5000     B        B
6000     B        H
7000     C        L
8000     A        A
9000     A        A
10000    A        A
11000    A        E
12000    C        C
13000    C        C
14000    C        C
15000    C        C
16000    C        C
17000    C        J

Id列是唯一的,并且始终具有有序值。也许这有助于我们解决问题。很抱歉我找不到您的信息。我想要上面的解决方案。

我只想要col1和count。但不是col1唯一,计数必须是1,2,3 bla bla bla ...直到col1<> COL2 ... 必须重置此行计数后。

2 个答案:

答案 0 :(得分:1)

首先,我想指出,如果没有ORDER BY条款,则无法保证结果的顺序。要进行此类计算,请使用标识(自动增量)字段来建立订单。

也就是说,您可以尝试使用ROW_NUMBER()创建要订购的字段。

with yourtablewithrn as (
  select col1, col2, row_number() over (order by (select null)) rn
  from yourtable
  ), 
yourtablegrouped as (
  select *,
    rn - row_number() over (partition by col1 order by rn) as grp
  from yourtablewithrn
)
select col1,
       count(col2) AS cnt
from yourtablegrouped
group by col1, grp
order by min(rn)

答案 1 :(得分:0)

如上所述,我同意sgeddes的看法,我们需要某种顺序,我们可以依靠这种顺序来解决这类问题。 row_number()over()不会这样做,因为它或多或少是一个随机数:

create table yourtable
( n int
, col1 varchar(1)
, col2 varchar(1));

insert into yourtable values 
(1,'A','A'),
(2,'A','A'),
(3,'A','F'),
(4,'B','B'),
(5,'B','B'),
(6,'B','H'),
(7,'C','L'),
(8,'A','A'),
(9,'A','A'),
(10,'A','A'),
(11,'A','E'),
(12,'C','C'),
(13,'C','C'),
(14,'C','C'),
(15,'C','C'),
(16,'C','C'),
(17,'C','J');

对于此示例数据,col2没有任何影响。我们可以做(sgeddes解决方案的一个小变化):

select col1, count(1) 
from (
    select n, col1
         , col2
         , row_number() over (order by n)
         - row_number() over (partition by col1
                              order by n) as grp
    from yourtable
) t  
group by col1, grp
order by min(n)

但是,对于下面的样本,结果应该是什么?

delete from yourtable;
insert into yourtable values 
    ('A','A'),
    ('A','A'),
    ('A','F'),
    ('A','A'),
    ('A','G');