Teradata SQL: 搜索列中值第一次发生变化
Teradata SQL: Search for the first time a value changes in a column
所以,我有一个 table 每天跟踪客户帐户并记录每个工作日的值,例如该帐户的余额。
例如:
Acct_Nbr Acct_Open_Date System_Date Balance
-------------------------------------------------
111 2017-12-01 2017-12-01 0.00
111 2017-12-01 2017-12-04 0.00
111 2017-12-01 2017-12-05 0.00
111 2017-12-01 2017-12-06 500.00
222 2017-12-01 2017-12-01 0.00
222 2017-12-01 2017-12-04 0.00
222 2017-12-01 2017-12-05 0.00
222 2017-12-01 2017-12-06 0.00
222 2017-12-01 2017-12-07 0.00
222 2017-12-01 2017-12-08 250.00
我正在尝试编写一个查询,该查询将 return Acct_Open_Date 和 System_Date 之间的天数,其中余额首次变为 > 0(即帐户获得资金)。
我计划使用 case when
语句(即 <=5 天、6-10 天等)对桶中的天数进行分组,并且对于每个桶 return #帐户数。
根据上面的table,会return:
Time_to_fund Count_of_accts
-----------------------------
<=5 days 1
6-10 days 1
>10 days 0
我不完全确定如何编写一个查询,该查询将在每个帐户的基础上搜索每一行,直到找到余额 > 0 的值,然后为该行取 System_Date 和从中减去 Acct_Open_Date 得到天数。
如有任何帮助,我们将不胜感激。谢谢!
尝试在 GROUP BY 中使用 GROUP BY:
SELECT CASE WHEN fund_times.Time_to_fund_in_days<= 5 THEN'<=5 days'
when fund_times.Time_to_fund_in_days<= 10 then '6-10 days'
ELSE '>10 days' END as Time_to_fund, COUNT(fund_times.acct_Number) AS Count_of_accts
(SELECT t.acct_Number, MIN( (t.System_Date - t.Acct_Open_Date) * 86400) as Time_to_fund_in_days
from table as T
WHERE t.Balance>0
GROUP BY t.acct_Number) AS fund_times
GROUP BY CASE WHEN fund_times.Time_to_fund_in_days<= 5 THEN'<=5 days'
when fund_times.Time_to_fund_in_days<= 10 then '6-10 days'
ELSE '>10 days' END
select
CASE WHEN diff <= 5 THEN'<=5 days'
when diff <= 10 then '6-10 days'
ELSE '>10 days'
END as Time_to_fund,
COUNT(*)
from
(
select
System_Date - Acct_Open_Date as diff -- number of days between
from mytable
where Balance > 0
qualify -- find the first row with a Balance > 5
row_number()
over (partition by Acct_Nbr
order by System_Date) = 1
) as dt
所以,我有一个 table 每天跟踪客户帐户并记录每个工作日的值,例如该帐户的余额。
例如:
Acct_Nbr Acct_Open_Date System_Date Balance
-------------------------------------------------
111 2017-12-01 2017-12-01 0.00
111 2017-12-01 2017-12-04 0.00
111 2017-12-01 2017-12-05 0.00
111 2017-12-01 2017-12-06 500.00
222 2017-12-01 2017-12-01 0.00
222 2017-12-01 2017-12-04 0.00
222 2017-12-01 2017-12-05 0.00
222 2017-12-01 2017-12-06 0.00
222 2017-12-01 2017-12-07 0.00
222 2017-12-01 2017-12-08 250.00
我正在尝试编写一个查询,该查询将 return Acct_Open_Date 和 System_Date 之间的天数,其中余额首次变为 > 0(即帐户获得资金)。
我计划使用 case when
语句(即 <=5 天、6-10 天等)对桶中的天数进行分组,并且对于每个桶 return #帐户数。
根据上面的table,会return:
Time_to_fund Count_of_accts
-----------------------------
<=5 days 1
6-10 days 1
>10 days 0
我不完全确定如何编写一个查询,该查询将在每个帐户的基础上搜索每一行,直到找到余额 > 0 的值,然后为该行取 System_Date 和从中减去 Acct_Open_Date 得到天数。
如有任何帮助,我们将不胜感激。谢谢!
尝试在 GROUP BY 中使用 GROUP BY:
SELECT CASE WHEN fund_times.Time_to_fund_in_days<= 5 THEN'<=5 days'
when fund_times.Time_to_fund_in_days<= 10 then '6-10 days'
ELSE '>10 days' END as Time_to_fund, COUNT(fund_times.acct_Number) AS Count_of_accts
(SELECT t.acct_Number, MIN( (t.System_Date - t.Acct_Open_Date) * 86400) as Time_to_fund_in_days
from table as T
WHERE t.Balance>0
GROUP BY t.acct_Number) AS fund_times
GROUP BY CASE WHEN fund_times.Time_to_fund_in_days<= 5 THEN'<=5 days'
when fund_times.Time_to_fund_in_days<= 10 then '6-10 days'
ELSE '>10 days' END
select
CASE WHEN diff <= 5 THEN'<=5 days'
when diff <= 10 then '6-10 days'
ELSE '>10 days'
END as Time_to_fund,
COUNT(*)
from
(
select
System_Date - Acct_Open_Date as diff -- number of days between
from mytable
where Balance > 0
qualify -- find the first row with a Balance > 5
row_number()
over (partition by Acct_Nbr
order by System_Date) = 1
) as dt