我有一个问题。我正在运行一个查询,我得到一个具有多个季度的单个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的事实。
答案 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