oracle sql将行复制到下面,像复制一样优秀

时间:2010-01-20 07:48:18

标签: sql oracle analytics

http://pastebin.com/m24c4f508

- 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

如果我理解你想要正确做什么(如果没有状态值,请使用上一行中的那个),你应该考虑使用 LAG 和LEAD结合NVL / COALESCE < / p>

答案 1 :(得分:0)

如果您只想获取前一行的状态NULL,请使用LAG

SELECT
  rn,
  device_num,
  COALESCE( status_01, LAG(status_01) OVER ( ORDER BY pri_id ) ) status_01,
  COALESCE( status_02, LAG(status_02) OVER ( ORDER BY pri_id ) ) status_02
FROM tt1
ORDER BY pri_id

您的示例从设置它的最后一行开始,因此您可能需要执行以下操作:

SELECT
  rn,
  device_num,
  COALESCE( status_01, ( SELECT MAX(status_01) KEEP( DENSE_RANK LAST ORDER BY pri_id )
                         FROM tt1 tt1_1
                         WHERE tt1_1.id < tt1.id
                         AND tt1_1.status_01 IS NOT NULL ) ) status_01,
  COALESCE( status_02, ( SELECT MAX(status_02) KEEP( DENSE_RANK LAST ORDER BY pri_id )
                         FROM tt1 tt1_2
                         WHERE tt1_2.id < tt1.id
                         AND tt1_2.status_02 IS NOT NULL ) ) status_02
FROM tt1
ORDER BY pri_id