Sql 在Oracle中基于列分组动态分配最小-最大值
在客户现场工作,遇到了一些奇怪的要求 以下是示例输入:Sql 在Oracle中基于列分组动态分配最小-最大值,sql,oracle,oracle11g,analytics,Sql,Oracle,Oracle11g,Analytics,在客户现场工作,遇到了一些奇怪的要求 以下是示例输入: 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
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
因此,逻辑如下:
动态选择需要添加到输出中的行数,以便
每个类别都有一个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)
超前和滞后可能有用。到目前为止您尝试了什么?在请求我们帮助之前,您应该向我们展示一些您的查询尝试。回答得好。我认为最好(或正确)使用
over(按t.category划分\u id按t.tier排序\u no)
@KaushikNayak确切地说,您的案例似乎更好,Kaushik,谢谢。