根据 Oracle 中的列分组动态分配 Min Max

Dynamically assign Min Max based on grouping of column in Oracle

在客户现场工作,遇到了一个有点奇怪的要求。

以下是示例输入:

Category_ID   Tier_No  Tier_Amount
371            1        0
371            2        20
403            1        0
403            2        25
403            3        100

所需输出:

Cat_ID         Min         Max 
371            0           20
371            20.01       NULL
403            0           25
403            25.01       100
403            100.01      NULL

所以逻辑如下:

动态选择需要将多少行添加到输出中 每个Category_ID。 第一行的 Min 始终为零,最后一行的 Max 始终为 NULL。 每个后续行(在相同 category_id 内)最小值必须比最后一行最大值大 0.01。

像这样:

SELECT Category_id,
       CASE WHEN Tier_Amount = 0 THEN 0 ELSE  Tier_Amount+0.01 END  MIN,
       (SELECT MIN(Tier_Amount) FROM T 
            WHERE Category_id = T1.Category_ID 
            AND Tier_No > T1.Tier_No)   MAX

FROM T T1
ORDER BY Category_id,Tier_no

SQLFiddle demo

主要起点是使用 LEAD 分析函数:

select t.category_id as "Cat_ID",
   (t.tier_amount+.01)*sign(t.tier_amount) as "Min", 
   lead(t.tier_amount,1,null) over (partition by t.category_id order by t.tier_no) as "Max"
  from mytable t;

Cat_ID  Min     Max
------  ------  ------
 371    0       20
 371    20.01   (null)
 403    0       25
 403    25.01   100
 403    100.01  (null)

SQL Fiddle Demo