[英]Using a pl-sql procedure or cursor to select top 3 rank
有人可以告诉我如何获得以下结果。
使用等级<= 2的density_rank函数将为我提供前2个报价。
我还希望得到“ total_offer”,它应该是“ offer1”和“ offer2”的总和。 当没有offer2(例如:金牛座)时,“ offer1”的“ total offer”应为“ offer1”,“ offer2”的“ null”应为“ null”
输入:
customer make zipcode offer
mark focus 101 250
mark focus 101 2500
mark focus 101 1000
mark focus 101 1500
henry 520i 21405 500
henry 520i 21405 100
henry 520i 21405 750
henry 520i 21405 100
mark taurus 48360 250
mark mustang 730 500
mark mustang 730 1000
mark mustang 730 1250
所需输出:
| CUSTOMER | MAKE | ZIPCODE | TOP_OFFER1 | TOP_OFFER2 | Total_offer |
| henry | 520i | 21405 | 750 | 500 | 1250
| mark | focus | 101 | 2500 | 1500 | 4000
| mark | mustang | 730 | 1250 | 1000 | 2250
| mark | taurus | 48360 | 250 | NULL| 250 |
尝试这个....
select * from (
select customer,make,zipcode,offer, dense_rank() over (PARTITION by customer order by customer,make, zipcode,offer desc) Rank from tablename)
where Rank <4;
Oracle 11g R2架构设置 :
CREATE TABLE TEST ( customer, make, zipcode, offer ) AS
SELECT 'mark', 'focus', 101, 250 FROM DUAL
UNION ALL SELECT 'mark', 'focus', 101, 2500 FROM DUAL
UNION ALL SELECT 'mark', 'focus', 101, 1000 FROM DUAL
UNION ALL SELECT 'mark', 'focus', 101, 1500 FROM DUAL
UNION ALL SELECT 'henry', '520i', 21405, 500 FROM DUAL
UNION ALL SELECT 'henry', '520i', 21405, 100 FROM DUAL
UNION ALL SELECT 'henry', '520i', 21405, 750 FROM DUAL
UNION ALL SELECT 'henry', '520i', 21405, 100 FROM DUAL
UNION ALL SELECT 'mark', 'taurus', 48360, 250 FROM DUAL
UNION ALL SELECT 'mark', 'mustang', 730, 500 FROM DUAL
UNION ALL SELECT 'mark', 'mustang', 730, 1000 FROM DUAL
UNION ALL SELECT 'mark', 'mustang', 730, 1250 FROM DUAL;
查询1-如果每个组最多需要3行 :
WITH ranks AS (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY CUSTOMER, MAKE, ZIPCODE ORDER BY OFFER DESC ) AS RANK
FROM TEST t
)
SELECT *
FROM RANKS
WHERE RANK <= 3
结果 :
| CUSTOMER | MAKE | ZIPCODE | OFFER | RANK |
|----------|---------|---------|-------|------|
| henry | 520i | 21405 | 750 | 1 |
| henry | 520i | 21405 | 500 | 2 |
| henry | 520i | 21405 | 100 | 3 |
| mark | focus | 101 | 2500 | 1 |
| mark | focus | 101 | 1500 | 2 |
| mark | focus | 101 | 1000 | 3 |
| mark | mustang | 730 | 1250 | 1 |
| mark | mustang | 730 | 1000 | 2 |
| mark | mustang | 730 | 500 | 3 |
| mark | taurus | 48360 | 250 | 1 |
查询2-如果您想要包括领带的前3名 :
WITH ranks AS (
SELECT t.*,
DENSE_RANK() OVER ( PARTITION BY CUSTOMER, MAKE, ZIPCODE ORDER BY OFFER DESC ) AS RANK
FROM TEST t
)
SELECT *
FROM RANKS
WHERE RANK <= 3
结果 :
| CUSTOMER | MAKE | ZIPCODE | OFFER | RANK |
|----------|---------|---------|-------|------|
| henry | 520i | 21405 | 750 | 1 |
| henry | 520i | 21405 | 500 | 2 |
| henry | 520i | 21405 | 100 | 3 |
| henry | 520i | 21405 | 100 | 3 |
| mark | focus | 101 | 2500 | 1 |
| mark | focus | 101 | 1500 | 2 |
| mark | focus | 101 | 1000 | 3 |
| mark | mustang | 730 | 1250 | 1 |
| mark | mustang | 730 | 1000 | 2 |
| mark | mustang | 730 | 500 | 3 |
| mark | taurus | 48360 | 250 | 1 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.