Teradata SQL 最后 X 个不同列排列的标志(按排名)
Teradata SQL flag for last X distinct column permutations by rank
我的 Teradata SQL 查询在 table 中找到所有唯一的财政 year/fiscal 周组合并按时间顺序排列它们:
select
fiscalyear,fiscalweek,
fiscalyear||fiscalweek as yrwkperm
from table
qualify count(*) over (partition by yrwkperm rows unbounded preceding) = 1
order by fiscalyear,fiscalweek
然后我获取生成的数据集并添加另一列指定周的时间顺序,但只是行号,因为我按财政年度、财政周订购:
然后我添加另一个逻辑列,上面写着(伪代码)
If (chrono >= (max(chrono)-52+1)) then "Last52Weeks" else "NotLast52Weeks"
如果财政year/fiscal周排列在数据集的最后 52 周内,则括号中的表达式将为 TRUE。 (我在不同财政 year/fiscal 周排列列表中没有不连续性,所以我不担心行号与周的时间顺序不同)。
所以我的问题是,我可以在单个 TD SQL 查询中创建一个带有 "last 52 weeks yes/no" 二进制标志的列吗?
在此先感谢您的帮助。
我添加了一个 reverse_chrono 列,该列的作用与您的计时列相反。这会简化您的 "last 52 weeks" 指示的逻辑。添加了一个案例语句来执行过去 52 周的逻辑,如下所示。
select fiscalyear, fiscalyearweek, chrono, reverse_chrono, case when reverse_chrono <= 52 then 'YES' else 'NO' end last_52_weeks
from "your date table/query"
这是我用于 chrono 和 reverser_chrono 的函数。在 Teradata 中,您可以为列添加别名并在您的案例语句中使用。
select fiscalyear, fiscal_week_of_year as fiscalweek,
row_number() over (order by fiscalyear, fiscalweek) as chrono,
row_number() over (order by fiscalyearDESC, fiscalweekDESC) as reverse_chrono,
case when reverse_chrono <= 52 then 'YES' else 'NO' end last_52_weeks ...
这应该可以满足您的需求(我将 QUALIFY 更改为简单的 GROUP BY,应该会更有效率):
select
fiscalyear,fiscalweek,
row_number() over (order by fiscal year,fiscal week) as chrono,
case when chrono > count(*) over () - 52
then 'Last52Weeks'
else 'NotLast52Weeks'
end
from table
group by 1,2
这将在 Explain 中产生一个 STAT-step。
我的 Teradata SQL 查询在 table 中找到所有唯一的财政 year/fiscal 周组合并按时间顺序排列它们:
select
fiscalyear,fiscalweek,
fiscalyear||fiscalweek as yrwkperm
from table
qualify count(*) over (partition by yrwkperm rows unbounded preceding) = 1
order by fiscalyear,fiscalweek
然后我获取生成的数据集并添加另一列指定周的时间顺序,但只是行号,因为我按财政年度、财政周订购:
然后我添加另一个逻辑列,上面写着(伪代码) If (chrono >= (max(chrono)-52+1)) then "Last52Weeks" else "NotLast52Weeks"
如果财政year/fiscal周排列在数据集的最后 52 周内,则括号中的表达式将为 TRUE。 (我在不同财政 year/fiscal 周排列列表中没有不连续性,所以我不担心行号与周的时间顺序不同)。
所以我的问题是,我可以在单个 TD SQL 查询中创建一个带有 "last 52 weeks yes/no" 二进制标志的列吗?
在此先感谢您的帮助。
我添加了一个 reverse_chrono 列,该列的作用与您的计时列相反。这会简化您的 "last 52 weeks" 指示的逻辑。添加了一个案例语句来执行过去 52 周的逻辑,如下所示。
select fiscalyear, fiscalyearweek, chrono, reverse_chrono, case when reverse_chrono <= 52 then 'YES' else 'NO' end last_52_weeks
from "your date table/query"
这是我用于 chrono 和 reverser_chrono 的函数。在 Teradata 中,您可以为列添加别名并在您的案例语句中使用。
select fiscalyear, fiscal_week_of_year as fiscalweek,
row_number() over (order by fiscalyear, fiscalweek) as chrono,
row_number() over (order by fiscalyearDESC, fiscalweekDESC) as reverse_chrono,
case when reverse_chrono <= 52 then 'YES' else 'NO' end last_52_weeks ...
这应该可以满足您的需求(我将 QUALIFY 更改为简单的 GROUP BY,应该会更有效率):
select
fiscalyear,fiscalweek,
row_number() over (order by fiscal year,fiscal week) as chrono,
case when chrono > count(*) over () - 52
then 'Last52Weeks'
else 'NotLast52Weeks'
end
from table
group by 1,2
这将在 Explain 中产生一个 STAT-step。