分组从负到大于或等于0的行

时间:2019-01-28 21:51:14

标签: sql teradata

我正在尝试将单个帐户中的帐户余额从负数变为大于或等于0的实例进行分组。例如,在下表中,account1从负数变为大于或等于0的三倍。我想自动化一种将它们组合在一起并加以区分的方法。下面是我正在使用的示例表

sample table

在这一点上,我正在手动进入并使每个实例唯一。以下是理想的结果

desired results table

这是我的代码,可以手动创建上表:

SELECT DISTINCT acct_nbr,
CASE
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 1 AND 3 THEN acct_nbr || 'a' --first instance
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 4 AND 5 THEN acct_nbr || 'b' --second instance
    WHEN acct_nbr = 'account1' AND row_num BETWEEN 6 AND 7 THEN acct_nbr || 'c' --third instance
    ELSE acct_nbr
END AS acct_upt

谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,0不是肯定的。但是,无论如何,每个组似乎都是通过之后的非负值来确定的。但是,这会产生一个递减数字,而您需要一个递增数字。使用dense_rank()可以轻松修复。

最后,让字母追加没有意义。因此,我将最后一部分添加为单独的列,您可以弄清楚如何将信息与帐号组合在一起:

select acct_nbr,
       dense_rank() over (partition by acct_nbr order by grp desc) as modifier, 
       row_num, sys_dt, end_bal
from (select t.*,
             sum(case when end_bal >= 0 then 1 else 0 end) over (partition by acct_nbr order by sys_dt) as grp
      from t
     ) t;