在oracle中如何使用OVER (PARTITION BY ???) AS Count, group changers , count should reset to 1

问题描述 投票:0回答:2

我有一个带有 [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
---------------------------------------------------------------------------------
sql oracle oracle11g gaps-and-islands
2个回答
1
投票

在您改变主意并修改示例表内容之后,它似乎是关于 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>

0
投票

从 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.