根据 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
主要起点是使用 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)
在客户现场工作,遇到了一个有点奇怪的要求。
以下是示例输入:
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
主要起点是使用 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)