【问题标题】:Dynamic crosstab using generate_series使用 generate_series 的动态交叉表
【发布时间】:2016-05-29 14:11:48
【问题描述】:

尝试使用 generate_series 进行动态交叉表。但没有运气。

这个“STATIC”查询按预期工作:

SELECT * FROM crosstab(
$$ SELECT DISTINCT ON(sign,date) sign,date,sum(hr) FROM hr $$,
$$ SELECT * FROM(SELECT to_char(generate_series('2014-01-01','2014-01-05', interval '1 day'),'YYYY-MM-DD') date )date$$) 
as ct (sign text,"2014-01-01" text,"2014-01-02" text,"2014-01-03" text,"2014-01-04" text,"2014-01-05" text)

我想用动态查询替换最后一部分:

sign text,"2014-01-01" text,"2014-01-02" text,"2014-01-03" text,"2014-01-04" text,"2014-01-05" text

我设法通过以下方式创建了这个:

SELECT concat('sign text,',(SELECT string_agg(col,',') from( select to_char(generate_series('2015-01-01','2015-01-05', interval '1 day'),'\"YYYY-MM-DD\" text')col )cols))

生成与上面相同的文本。用这个“DYNAMIC”查询替换这个“STATIC”文本不起作用:

SELECT * FROM crosstab(
$$ SELECT DISTINCT ON(sign,date) sign,date,sum(hr) FROM hr $$,
$$ SELECT * FROM(SELECT to_char(generate_series('2014-01-01','2014-01-05', interval '1 day'),'YYYY-MM-DD') date )date$$) 
as ct (SELECT concat('sign text,',(SELECT string_agg(col,',') from( SELECT to_char(generate_series('2015-01-01','2015-01-05', interval '1 day'),'\"YYYY-MM-DD\" text')col )cols)))

“SELECT”处或附近的语法错误

为什么?任何提示如何以简单的方式进行此动态操作? (最好不使用函数)

TIA,

【问题讨论】:

  • 不使用函数就无法执行动态构造的SQL。

标签: postgresql postgresql-9.1 crosstab


【解决方案1】:

这里的问题是计划者在计划之前需要知道行的大​​小。所以你有几个选择:

  1. 选择列表并以客户端语言动态生成查询或
  2. 选择列表并以服务器端非 SQL 语言动态生成查询(我会选择 plpgsql 或 plperl)。

现在,第一个更简洁,因为第二个只是转移了问题,因此您可能必须返回 refcursor 并从中获取,因为规划器需要在返回之前知道函数的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2012-08-12
    • 2013-09-17
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多