我有一个带有 [row, grp and pdate] 列的 Oracle 表,我不需要每个 [pdate] ] 列出现 [grp] 列,如果在其余行中重复相同的 [grp] 计数应该得到休息预期结果 [表 3]
表数据【表一】
ROW GRP PDATE
----------------------
0001 361 06-MAR-23
0002 361 07-MAR-23
0003 361 08-MAR-23
0004 417 09-MAR-23
0005 361 10-MAR-23
0006 361 11-MAR-23
0007 362 12-MAR-23
0008 361 13-MAR-23
0009 361 14-MAR-23
0010 361 15-MAR-23
0011 361 16-MAR-23
0012 417 17-MAR-23
0013 417 18-MAR-23
0014 362 19-MAR-23
0015 362 20-MAR-23
0016 362 21-MAR-23
不起作用的 SQL [表 2]
select ROW,GRP,PDATE
,count (1) OVER ( PARTITION BY A.GRP ORDER BY A.GRP,A.PDATE) AS COUNT
from t2 a ORDER BY PDATE;
ROW_ GRP_ PDATE_ COUNT
---------------------- ---------------------- ------------------------- ----------------------
48 361 06-MAR-23 1
49 361 07-MAR-23 2
34 362 08-MAR-23 1
50 361 08-MAR-23 3
51 417 09-MAR-23 1
35 362 09-MAR-23 2
52 361 10-MAR-23 4
36 362 10-MAR-23 3
53 361 11-MAR-23 5
40 388 12-MAR-23 1
54 361 12-MAR-23 6
55 361 13-MAR-23 7
41 388 13-MAR-23 2
42 388 14-MAR-23 3
56 361 14-MAR-23 8
43 388 15-MAR-23 4
57 361 15-MAR-23 9
[表3]
预期结果(使用 Oracle COUNT( 1 ) OVER ( PARTITION BY ??? order by ) AS Count) 基于日期中没有出现 GRP)
ROW GRP PDATE COUNT
---------------------- ------
0001 361 06-MAR-23 3
0002 361 07-MAR-23 3
0003 361 08-MAR-23 3
0004 417 09-MAR-23 1
0005 361 10-MAR-23 2
0006 361 11-MAR-23 2
0007 362 12-MAR-23 1
0008 361 13-MAR-23 4
0009 361 14-MAR-23 4
0010 361 15-MAR-23 4
0011 361 16-MAR-23 4
0012 417 17-MAR-23 2
0013 417 18-MAR-23 2
0014 362 19-MAR-23 3
0015 362 20-MAR-23 3
0016 362 21-MAR-23 3
目的是根据计数列给出的结果创建带有“colspan”的html表格
---------------------------------------------------------------------------------------------
DATE | 06-MAR-23 (COLSPAN=3) | 07-MAR-23 COLSPAN=1 | 08-MAR-23 COLSPAN=3
---------------------------------------------------------------------------------
AAA | 361-1 | 361-2 | 361-3 | 417-1 | 361-1 | 361-2
---------------------------------------------------------------------------------
在您改变主意并修改示例表内容之后,它似乎是关于 islands 的,毕竟。首先创建“组”(我代码中的
rn
列),然后以解析形式应用 count
函数。
SQL> with test (row_, grp, pdate) as
2 (select '0001', 361, date '2023-03-06' from dual union all
3 select '0002', 361, date '2023-03-07' from dual union all
4 select '0003', 361, date '2023-03-08' from dual union all
5 select '0004', 417, date '2023-03-09' from dual union all
6 select '0005', 361, date '2023-03-10' from dual union all
7 select '0006', 361, date '2023-03-11' from dual
8 ),
9 temp as
10 (select row_, grp, pdate,
11 to_number(row_) - row_number() over (partition by grp order by pdate) rn
12 from test
13 )
14 select row_, grp, pdate,
15 count(*) over (partition by rn) cnt
16 from temp
17 order by pdate;
ROW_ GRP PDATE CNT
---- ---------- --------- ----------
0001 361 06-mar-23 3
0002 361 07-mar-23 3
0003 361 08-mar-23 3
0004 417 09-mar-23 1
0005 361 10-mar-23 2
0006 361 11-mar-23 2
6 rows selected.
SQL>
从 Oracle 12 开始,您可以使用
MATCH_RECOGNIZE
进行逐行模式匹配:
SELECT rw,
grp,
pdate,
COUNT(*) OVER (PARTITION BY mn) AS cnt
FROM table1
MATCH_RECOGNIZE(
ORDER BY rw
MEASURES
MATCH_NUMBER() AS mn
ALL ROWS PER MATCH
PATTERN (same_grp+)
DEFINE same_grp AS FIRST(grp) = grp
)
其中,对于示例数据:
CREATE TABLE table1 (RW, GRP, PDATE) AS
SELECT '0001', 361, DATE '2023-03-06' FROM DUAL UNION ALL
SELECT '0002', 361, DATE '2023-03-07' FROM DUAL UNION ALL
SELECT '0003', 361, DATE '2023-03-08' FROM DUAL UNION ALL
SELECT '0004', 471, DATE '2023-03-09' FROM DUAL UNION ALL
SELECT '0005', 361, DATE '2023-03-10' FROM DUAL UNION ALL
SELECT '0006', 361, DATE '2023-03-11' FROM DUAL UNION ALL
SELECT '0007', 362, DATE '2023-03-12' FROM DUAL UNION ALL
SELECT '0008', 361, DATE '2023-03-13' FROM DUAL UNION ALL
SELECT '0009', 361, DATE '2023-03-14' FROM DUAL UNION ALL
SELECT '0010', 361, DATE '2023-03-15' FROM DUAL UNION ALL
SELECT '0011', 361, DATE '2023-03-16' FROM DUAL UNION ALL
SELECT '0012', 417, DATE '2023-03-17' FROM DUAL UNION ALL
SELECT '0013', 417, DATE '2023-03-18' FROM DUAL UNION ALL
SELECT '0014', 362, DATE '2023-03-19' FROM DUAL UNION ALL
SELECT '0015', 362, DATE '2023-03-20' FROM DUAL UNION ALL
SELECT '0016', 362, DATE '2023-03-21' FROM DUAL;
输出:
RW | 收视率 | 更新 | 碳纳米管 |
---|---|---|---|
0001 | 361 | 2023-03-06 00:00:00 | 3 |
0002 | 361 | 2023-03-07 00:00:00 | 3 |
0003 | 361 | 2023-03-08 00:00:00 | 3 |
0004 | 471 | 2023-03-09 00:00:00 | 1 |
0005 | 361 | 2023-03-10 00:00:00 | 2 |
0006 | 361 | 2023-03-11 00:00:00 | 2 |
0007 | 362 | 2023-03-12 00:00:00 | 1 |
0008 | 361 | 2023-03-13 00:00:00 | 4 |
0011 | 361 | 2023-03-16 00:00:00 | 4 |
0010 | 361 | 2023-03-15 00:00:00 | 4 |
0009 | 361 | 2023-03-14 00:00:00 | 4 |
0012 | 417 | 2023-03-17 00:00:00 | 2 |
0013 | 417 | 2023-03-18 00:00:00 | 2 |
0015 | 362 | 2023-03-20 00:00:00 | 3 |
0014 | 362 | 2023-03-19 00:00:00 | 3 |
0016 | 362 | 2023-03-21 00:00:00 | 3 |