Teradata:对连续宿舍进行排名。

时间:2018-08-20 18:05:23

标签: teradata

我有一个问题。我正在运行一个查询,我得到一个具有多个季度的单个ID,它们已满足某些条件。我想对那些只有连续四个季度的连续季度进行排名。

    ID  FISCAL_QTR  Completed_Fiscal_Qtr    RANKING
    5         2016Q2             ?                   9
    5         2016Q3             ?                   8
    5         2016Q4             ?                   7
    5         2017Q1             ?                   6
    5         2017Q2             ?                   5
    5         2017Q3             ?                   4
    5         2018Q1             ?                   3
    5         2018Q3             ?                   2
    5         2018Q4           2018Q3                1

这就是我目前得到的。我想看到这个ID的排名为2,这是基于他们拥有2018q4和2018q3且错过了2018q2的事实。

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决此问题。我认为,更强大的方法之一是使用期间Normalization,这需要将fiscal_qtr切换到日期期间。

例如,2016Q1将变为PERIOD(DATE '2016-01-01', DATE '2017-04-01')。对每条记录执行此操作,然后对期间进行归一化,将为您提供两个不连续的块,您可以使用P_INTERSECT加入到原始期间,然后在其上运行RANK()ROW_NUMBER()

WITH dates AS
(
    SELECT 
        PERIOD(MIN(cal.calendar_date), NEXT(MAX(calendar_date))) AS qperiod,
        fiscal_qtr
    FROM your_table
        INNER JOIN Sys_Calendar."CALENDAR" cal
            ON SUBSTR(Fiscal_Qtr, 1, 4) = cal.year_of_calendar
            AND SUBSTR(Fiscal_Qtr, 6, 1) = cal.quarter_of_year
    GROUP BY 2
)
SELECT ROW_NUMBER() OVER (PARTITION BY d1.qperiod ORDER BY d2.qperiod) AS your_rank,
    d2.fiscal_qtr
FROM (SELECT NORMALIZE qperiod FROM dates) d1
    LEFT OUTER JOIN dates d2 
        ON d1.qperiod P_INTERSECT d2.qperiod IS NOT NULL