Oracle SQL - SCD 跟踪随时间变化的属性
Oracle SQL - SCD track changed attribute through time
我遇到了以下错误:
ORA-30483: window functions are not allowed here
30483. 00000 - "window functions are not allowed here"
我正在尝试构建 BOOK_NO 和 WALK_NO 属性随时间变化的水平视图。
我认为一个合理的方法是对 effective_to 日期进行排名,然后只解码该值的 book_no||walk_no 属性....但不确定去哪里从这里开始!
SQL 下面:
Select METER_PIT_REF
,MAX(DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),1,BOOK_NO||WALK_NO) )
,MAX(DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),2,BOOK_NO||WALK_NO) )
,MAX DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),3,BOOK_NO||WALK_NO) )
FROM BW_PIT_BOOKWALK_BRIDGE
WHERE BOOK_NO = 'M04'
GROUP BY METER_PIT_REF
非常感谢任何建议!
使用子查询:
Select METER_PIT_REF,
MAX(CASE WHEN r = 1 THEN BOOK_NO||WALK_NO END),
MAX(CASE WHEN r = 2 THEN BOOK_NO||WALK_NO END),
MAX(CASE WHEN r = 3 THEN BOOK_NO||WALK_NO END)
FROM (SELECT b.*,
RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC) as r
FROM BW_PIT_BOOKWALK_BRIDGE
) b
WHERE BOOK_NO = 'M04'
GROUP BY METER_PIT_REF;
我也用 CASE
替换了 DECODE()
。它是等效的 ANSI 标准。
我遇到了以下错误:
ORA-30483: window functions are not allowed here
30483. 00000 - "window functions are not allowed here"
我正在尝试构建 BOOK_NO 和 WALK_NO 属性随时间变化的水平视图。
我认为一个合理的方法是对 effective_to 日期进行排名,然后只解码该值的 book_no||walk_no 属性....但不确定去哪里从这里开始!
SQL 下面:
Select METER_PIT_REF
,MAX(DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),1,BOOK_NO||WALK_NO) )
,MAX(DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),2,BOOK_NO||WALK_NO) )
,MAX DECODE( RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC),3,BOOK_NO||WALK_NO) )
FROM BW_PIT_BOOKWALK_BRIDGE
WHERE BOOK_NO = 'M04'
GROUP BY METER_PIT_REF
非常感谢任何建议!
使用子查询:
Select METER_PIT_REF,
MAX(CASE WHEN r = 1 THEN BOOK_NO||WALK_NO END),
MAX(CASE WHEN r = 2 THEN BOOK_NO||WALK_NO END),
MAX(CASE WHEN r = 3 THEN BOOK_NO||WALK_NO END)
FROM (SELECT b.*,
RANK() OVER (PARTITION BY METER_PIT_REF ORDER BY EFFECTIVE_TO DESC) as r
FROM BW_PIT_BOOKWALK_BRIDGE
) b
WHERE BOOK_NO = 'M04'
GROUP BY METER_PIT_REF;
我也用 CASE
替换了 DECODE()
。它是等效的 ANSI 标准。