GP诡异的查询转换

原始数据:
edw=# select * from ods.my_test2;
 i_a | i_b |  i_c   
-----+-----+--------
 b   | 5   | 201501
 b   | 5   | 201502
 b   | 6   | 201503
 a   | 1   | 201502
 a   | 1   | 201503
 a   | 1   | 201508
 a   | 2   | 201505
 a   | 2   | 201507
 a   | 2   | 201506
 a   | 1   | 201509
 a   | 1   | 201501
 a   | 1   | 201501

SELECT 
m.*,
case
when lag(m.i_a) over(PARTITION by m.i_a ORDER BY m.i_c) = m.i_a and lag(m.i_b) over(PARTITION by m.i_a order by m.i_c)=m.i_b 
  then case 
   when m.id=min(m.id) over(PARTITION by m.i_a ORDER BY m.i_c) then id else NULL
end else id end flag
FROM (select i_a,i_b,i_c,row_number() over(ORDER BY i_c) as id from ods.my_test2 ) m
结果
 i_a | i_b |  i_c   | id | flag 
-----+-----+--------+----+------
 a   | 1   | 201501 |  3 |    3
 a   | 1   | 201501 |  2 |    2
 a   | 1   | 201502 |  4 |     
 a   | 1   | 201503 |  7 |     
 a   | 2   | 201505 |  8 |    8
 a   | 2   | 201506 |  9 |     
 a   | 2   | 201507 | 10 |     
 a   | 1   | 201508 | 11 |   11
 a   | 1   | 201509 | 12 |     
 b   | 5   | 201501 |  1 |    1
 b   | 5   | 201502 |  5 |     
 b   | 6   | 201503 |  6 |    6
从语句上来说得出这个结果是有问题的,第一行数据的flag应该是空的,不应该是3

将子查询变成实表
create table ods.my_test as select i_a,i_b,i_c,row_number() over(ORDER BY i_c) as id from ods.my_test2;
再从实表中查询
SELECT 
m.*,
case
when lag(m.i_a) over(PARTITION by m.i_a ORDER BY m.i_c) = m.i_a and lag(m.i_b) over(PARTITION by m.i_a order by m.i_c)=m.i_b 
  then case 
   when m.id=min(m.id) over(PARTITION by m.i_a ORDER BY m.i_c) then id else NULL
end else id end flag
FROM ods.my_test m
结果:
 i_a | i_b |  i_c   | id | flag 
-----+-----+--------+----+------
 a   | 1   | 201501 |  2 |    2
 a   | 1   | 201501 |  3 |     
 a   | 1   | 201502 |  4 |     
 a   | 1   | 201503 |  7 |     
 a   | 2   | 201505 |  8 |    8
 a   | 2   | 201506 |  9 |     
 a   | 2   | 201507 | 10 |     
 a   | 1   | 201508 | 11 |   11
 a   | 1   | 201509 | 12 |     
 b   | 5   | 201501 |  1 |    1
 b   | 5   | 201502 |  5 |     
 b   | 6   | 201503 |  6 |    6
这个结果和上面的结果有差异,这种情况和oracle的查询转换很相似。但在GP中没有找到oracle的/*+NO_MERGE(m)*/功能,只能在存储过程中将这个子查询用临时表去解决了!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29989552/viewspace-2125249/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29989552/viewspace-2125249/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值