无法在使用postgresql 8.3的greenplum中的查询中获取序列的currval或lastval

时间:2015-04-20 16:52:08

标签: greenplum postgresql-8.3

我试图在不编写函数的情况下在查询中解决问题。 我有一个表,其中包含以下用户信息:

user_id user_name user_phone_number user_location created_at
1         abc          123              X         2014-01-01
1         abc          123              X         2014-02-01
1         abc          123              Y         2014-10-01
1         abc          123              Z         2014-11-01
1         abc          123              Z         2014-12-01
1         abc          123              X         2015-01-01

我需要将其转换为SCD-Type II表,如下所示:

user_id user_name user_ph_num user_location valid_from_dt valid_to_dt   
1         abc        123         X           2014-01-01   2014-09-30
1         abc        123         Y           2014-10-01   2014-10-31
1         abc        123         Z           2014-11-01   2014-12-31
1         abc        123         X           2015-01-01   2999-12-31

我认为实现这一目标的是:

一步到位: temp_table1:

id user_name user_ph_num user_location created_at is_same_with_previous
1         abc     123              X   2014-01-01          f
1         abc     123              X   2014-02-01          t
1         abc     123              Y   2014-10-01          f
1         abc     123              Z   2014-11-01          f
1         abc     123              Z   2014-12-01          t
1         abc     123              X   2015-01-01          f

第二步:

temp_table2:

id user_name user_ph_num user_loc created_at is_same_with_previous sr_no
1         abc     123        X    2014-01-01          f             1
1         abc     123        X    2014-02-01          t             1
1         abc     123        Y    2014-10-01          f             2
1         abc     123        Z    2014-11-01          f             3
1         abc     123        Z    2014-12-01          t             3
1         abc     123        X    2015-01-01          f             4

在此之后,我可以查询如下并获得所需的结果:

select id,user_name,user_ph_num,user_loc,min(created_at) as valid_from,
max(created_at) as valid_to
from temp_table2
group by sr_no,id,user_name,user_ph_num,user_loc;

我创建了第1步,但我无法创建temp_table2(步骤2)。 我使用以下查询来实现:

select setval('ser_no',2);

select *
CASE WHEN is_same_with_previous 
THEN (SELECT setval('ser_no',nextval('ser_no')-1))
ELSE nextval('ser_no') END as diff_sr_no
from temp_table1;

结果如下: temp_table2:

id user_name user_ph_num user_loc created_at is_same_with_previous sr_no
1         abc     123        X    2014-01-01          f             1
1         abc     123        X    2014-02-01          t             1
1         abc     123        Y    2014-10-01          f             2
1         abc     123        Z    2014-11-01          f             3
1         abc     123        Z    2014-12-01          t             1
1         abc     123        X    2015-01-01          f             4

有人可以帮助解决这个问题吗? 我使用正确的方法吗? 在此先感谢!!!

1 个答案:

答案 0 :(得分:0)

你使用的是错误的做法。您应该查看数据库中的“窗口函数”,您可能需要“row_number()”,“rank()”和“lag()”。通常,创建SCD2可以在单个查询中完成。在您的情况下,查询应该:

  1. 删除所有字段的重复项
  2. 除了“created_at”和“created_at”之外的所有字段在分区上应用rank()
  3. 对于每个等级,请选择最小“created_at”
  4. “created_at”是valid_from,“lag(created_at)超过分区依据(按创建的__ desc命令)”为valid_to