温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - Calculate count based on multiple groups of 7 number range in Oracle
count grouping oracle sql

sql - 在Oracle中基于7个数字范围的多个组计算计数

发布于 2020-04-04 00:47:27

有人可以帮我吗,我被困在这里。

给定

AMOUNT  CUSTOMER_NUMBER GROUPID SEQF
1000+   5555            51      2       
1000+   5555            52      3
1000+   5555            55      4   
1000+   5555            56      4   
1000+   5555            57      4       
1000+   5555            58      2   
1000+   5555            59      4   
1000+   5555            61      2
2000+   6666            55      2
.
.   
.
.

通过考虑AMOUNT和CUSTOMER_NUMBER列,此处在7个GROUPID编号内创建了组

例如, 第一组用于5555 CUSTOMER_NUMBER->(51至57 GROUP ID),第二组用于5555 CUSTOMER_NUMBER(58至61 GROUP ID),第三组用于6666 CUSTOMER_NUMBER(55 GROUP ID)

需要:

如果SEQF> = 2在从51到57的任何GROUPID中的第一组中,则认为COUNT(SEQF)= 1

如果SEQF> = 2在58到61之间的任何GROUPID中的第二组中,则认为COUNT(SEQF)= 1

所以总在这里

AMOUNT  CUSTOMER_NUMBER COUNT(SEQF)
1000+       5555                2

如果SEQF> = 2在55中的任何GROUPID中的第三组中,则认为COUNT(SEQF)= 1

AMOUNT  CUSTOMER_NUMBER COUNT(SEQF)
2000+       6666                1

期望的输出

AMOUNT  CUSTOMER_NUMBER COUNT(SEQF)
1000+       5555                2
2000+       6666                1

查看更多

提问者
NewTechGuy
被浏览
81
MT0 2020-01-31 21:20

没有其他答案可以解决组之间存在间隙的问题(他们只是假设组是连续的)。这将跳过间隙并将其groupid放入7的范围内。

Oracle安装程序

create table data(amount, customer_number, groupid, seqf) as (
    select '1000+', 5555, 51, 2 from dual union all
    select '1000+', 5555, 52, 3 from dual union all
    select '1000+', 5555, 55, 4 from dual union all
    select '1000+', 5555, 56, 4 from dual union all
    select '1000+', 5555, 57, 4 from dual union all
    select '1000+', 5555, 60, 2 from dual union all
    select '1000+', 5555, 61, 4 from dual union all
    select '1000+', 5555, 65, 2 from dual union all
    select '1000+', 5555, 69, 2 from dual union all
    select '2000+', 6666, 55, 2 from dual );

查询1

找到组:

SELECT amount,
       customer_number,
       groupid,
       groupid + 6 AS max_groupid
FROM   (
  SELECT d.*,
         MIN( groupid )
           OVER ( PARTITION BY amount, customer_number )
           AS min_groupid,
         MIN( groupid )
           OVER (
             PARTITION BY amount, customer_number
             ORDER BY groupid
             RANGE BETWEEN 7 FOLLOWING AND UNBOUNDED FOLLOWING
           )
           AS next_groupid
  FROM   data d
)
START WITH groupid = min_groupid
CONNECT BY PRIOR amount          = amount
AND        PRIOR customer_number = customer_number
AND        PRIOR next_groupid    = groupid

输出:

金额| CUSTOMER_NUMBER | GROUPID | MAX_GROUPID
:----- | --------------:| ------:| ----------:
1000+ | 5555 | 51 | 57
1000+ | 5555 | 60 | 66
1000+ | 5555 | 69 | 75
2000年以上| 6666 | 55 | 61

查询2

这计算了组数:

SELECT amount,
       customer_number,
       COUNT(*)
FROM   (
  SELECT d.*,
         MIN( groupid )
           OVER ( PARTITION BY amount, customer_number )
           AS min_groupid,
         MIN( groupid )
           OVER (
             PARTITION BY amount, customer_number
             ORDER BY groupid
             RANGE BETWEEN 7 FOLLOWING AND UNBOUNDED FOLLOWING
           )
           AS next_groupid
  FROM   data d
)
START WITH groupid = min_groupid
CONNECT BY PRIOR amount          = amount
AND        PRIOR customer_number = customer_number
AND        PRIOR next_groupid    = groupid
GROUP BY amount, customer_number

输出:

金额| CUSTOMER_NUMBER | 计数(*)
:----- | --------------:| -------:
1000+ | 5555 | 3
2000年以上| 6666 | 1个

db <> 在这里拨弄