【问题标题】:How do I debug this crosstab() Postgres function?如何调试这个 crosstab() Postgres 函数?
【发布时间】:2013-10-04 16:43:05
【问题描述】:

当前表格数据

表名:应用程序

id  | applied_class  |  applied_date
----+-------+-------------------------------
 27 | city1          | 2013-03-11 23:47:04.167624-04
 28 | city1          | 2013-03-11 23:58:28.90088-04
 29 | city2          | 2013-03-12 00:39:05.955988-04
 30 | city3          | 2013-03-12 01:07:28.30229-04
 31 | city2          | 2013-03-12 09:46:32.778106-04
 32 | city1          | 2013-03-12 23:06:52.262773-04
 33 | city2          | 2013-03-14 14:28:40.401831-04
 34 | city3          | 2013-03-15 19:33:59.346832-04
 35 | city2          | 2013-03-16 05:51:11.354835-04

所需的输出。

它是随时间变化的记录总数,按日期(天)和城市分组。

date        |  city1   |  city2   |  city3 
------------+----------+----------+--------
2013-03-11  |   2      |   0      |    0        
2013-03-12  |   3      |   2      |    1
2013-03-13  |   3      |   2      |    1
2013-03-14  |   3      |   3      |    0    
2013-03-15  |   3      |   3      |    2
2013-03-16  |   3      |   3      |    0

当前(失败)查询

我正在尝试逐步完成查询,但我碰壁了。下面的查询返回以下错误(请注意,当我在交叉表之外自行运行这些查询时,这些查询都可以正常工作):

详细信息:SQL rowid 数据类型与返回的 rowid 数据类型不匹配。

select *

from crosstab(
    $$select temp_table.d,  
       applied_class,  
       sum(temp_table.ct) over (order by d) 

    from   
       (
        select count(id) ct, 
               applied_class, 
               date_trunc('day', applied_date) d from application_app 
        where applied_class like '%L13' 
        group by applied_class, d 
        order by d
        ) as temp_table

    order by 1, 2$$)  -- end crosstab

as ct ("day" date, "city1" text, "city2" text, "city3" text);

【问题讨论】:

  • 您是否尝试过自己运行子查询?
  • @PM77-1:是的,正在更新相关上下文以澄清问题。

标签: sql postgresql crosstab


【解决方案1】:

回答一个旧帖子,因为我没有找到任何可以帮助我解决类似问题的具体内容。在我的查询中,行列是 2 个 varchar 的 concat,交叉表的输出也是 varchar。这给出了 rowid 错误。在交叉表输出中将 varchar 更改为文本消除了错误。

select * from crosstab(
    'select concat(.....) '
    ) as
ct(dname text,
ct1 float, ...;

【讨论】:

    【解决方案2】:

    首先,阅读the docs

    在我看来,您需要将日期字段重命名为“row_name”,将“applied_class”重命名为“category”。

    您必须问的基本问题是“函数如何知道根据什么标准来透视我的数据?”一旦你有了它就更容易了。

    编辑:您和我正在研究该函数的两个不同版本。第一个,我上面描述的那个,是你实际使用的那个(只有一个参数,文本 sql)。还有第二个版本,您可以自己提供交叉表标准,在这方面,类别被指定为第二个参数。

    您需要选择其中一种方式。

    【讨论】:

    • 这些是解释参数用途的占位符名称,而不是正确使用此函数所需的确切字符串。
    • 不完全。用解释更新了帖子。有几个交叉表函数,但两个主要函数指定交叉表标准的方式不同。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多