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

然后我获取生成的数据集并添加另一列指定周的时间顺序,但只是行号,因为我按财政年度、财政周订购:

Excel example screenshot

然后我添加另一个逻辑列,上面写着(伪代码) 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。