GP詭異的查詢轉換

orclwujian發表於2016-09-21
原始資料:
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章