我有一张这样的表:
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 ... 必须重置此行计数后。
答案 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');