|
CREATE TABLE t as
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union
select 1 a,'A'b from dual union
select 2 a,'B'b from dual union
select 2 a,'C'b from dual union
select 3 a,'A'b from dual union
select 4 a,'A'b from dual union
select 4 a,'D'b from dual union
select 4 a,'E'b from dual union
select 5 a,'A'b from dual;
用分析函数:
SELECT a,SUM(SUM(DECODE(rn,1,1))) OVER(ORDER BY a) cnt
FROM (SELECT t.*,ROW_NUMBER() OVER(PARTITION BY b ORDER BY a) rn FROM t)
GROUP BY a;
A CNT
---------- ----------
1 2
2 3
3 3
4 5
5 5
用分组聚合:
SELECT a,SUM(COUNT(*)) OVER(ORDER BY a) cnt
FROM (SELECT b,MIN(a) a FROM t GROUP BY b)
GROUP BY a;
A CNT
---------- ----------
1 2
2 3
4 5
有些日期缺失了,如果要补就用外连接:
SELECT t1.a,LAST_VALUE(t2.cnt IGNORE NULLS) OVER(ORDER BY t1.a)
FROM (SELECT DISTINCT a FROM t) t1
LEFT JOIN
(SELECT a,SUM(COUNT(*)) OVER(ORDER BY a) cnt
FROM (SELECT b,MIN(a) a FROM t GROUP BY b)
GROUP BY a
) t2
ON t1.a=t2.a;
|
|