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,谢谢。