繁体   English   中英

使用pl-sql过程或游标选择前3名

[英]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;

SQL小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM