使用仅具有选择权限的Oracle SQL,我需要基于条件提供
我一直在调整
我的当前代码-或者至少是它的代理:
这将返回一个数据集,看起来类似于这样:
我需要的是每当上个月的
ROW_NUMBER
输出。使用游标或循环将变得容易而简单,但现在我必须仅使用SQL来执行此任务。我一直在调整
row_number()
over
子句,我相信这是正确的方法,但现在我卡住了。我的当前代码-或者至少是它的代理:
WITH MYTABLE (FK_ID,FK_NAME,PK_ID,BIN_FLAG,MONTH,YEAR)AS (
SELECT 10000,'VARCHAR DESCRIPTION',75057,1,1,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,1,2,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,1,3,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,4,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,1,5,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,6,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,7,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,1,8,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,9,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,10,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,1,11,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,12,2016 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,1,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,2,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,3,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,4,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,5,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,6,2017 FROM DUAL
UNION SELECT 10000,'VARCHAR DESCRIPTION',75057,0,7,2017 FROM DUAL
)
SELECT
FK_ID
, FK_NAME
, PK_ID
, BIN_FLAG
, ROW_NUMBER() OVER (PARTITION BY FK_ID,PK_ID,BIN_FLAG ORDER BY YEAR,MONTH,FK_ID,PK_ID ASC) NEEDED_CALC
, MONTH
, YEAR
FROM MYTABLE
ORDER BY FK_ID,PK_ID,YEAR,MONTH
这将返回一个数据集,看起来类似于这样:
FK_ID FK_NAME PK_ID BIN_FLAG NEEDED_CALC MONTH YEAR
10000 VARCHAR DESCRIPTION 75057 1 1 1 2016
10000 VARCHAR DESCRIPTION 75057 1 2 2 2016
10000 VARCHAR DESCRIPTION 75057 1 3 3 2016
10000 VARCHAR DESCRIPTION 75057 0 1 4 2016
10000 VARCHAR DESCRIPTION 75057 1 4 5 2016
10000 VARCHAR DESCRIPTION 75057 0 2 6 2016
10000 VARCHAR DESCRIPTION 75057 0 3 7 2016
10000 VARCHAR DESCRIPTION 75057 1 5 8 2016
10000 VARCHAR DESCRIPTION 75057 0 4 9 2016
10000 VARCHAR DESCRIPTION 75057 0 5 10 2016
10000 VARCHAR DESCRIPTION 75057 1 6 11 2016
10000 VARCHAR DESCRIPTION 75057 0 6 12 2016
10000 VARCHAR DESCRIPTION 75057 0 7 1 2017
10000 VARCHAR DESCRIPTION 75057 0 8 2 2017
10000 VARCHAR DESCRIPTION 75057 0 9 3 2017
10000 VARCHAR DESCRIPTION 75057 0 10 4 2017
10000 VARCHAR DESCRIPTION 75057 0 11 5 2017
10000 VARCHAR DESCRIPTION 75057 0 12 6 2017
10000 VARCHAR DESCRIPTION 75057 0 13 7 2017
我需要的是每当上个月的
bin_flag
改变时,NEEDED_CALC
列都要重新计算。
因此,如果 bin_flag = 1
并且通过 lag
函数确定上一个月的 bin_flag
不同,则在 NEEDED_CALC
中的计数器列将被重置,并从 1
开始重新开始计算。