有人可以帮我吗,我被困在这里。
给定
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
没有其他答案可以解决组之间存在间隙的问题(他们只是假设组是连续的)。这将跳过间隙并将其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 <> 在这里拨弄