两个问题。
1.ORDER BY是必需的。
手册:
在实践中,SQL查询应始终指定
ORDER BY 1,2以确保输入行的顺序正确,即,具有相同值的值row_name在该行内被放在一起并正确地排序。
对于的单参数形式
crosstab(),
ORDER BY 1,2将是必需的。2. 一 列,每组具有不同的值。
手册:
crosstab(text source_sql, text category_sql)source_sql是产生数据源集的SQL语句。
…
此语句必须返回 一row_name列,一category列和一value列。它还可能有一个或多个“额外”列。该row_name列必须是第一列。在category与value列必须是最后两列的顺序。row_name
与之间的任何列category均被视为“额外”。对于具有相同row_name值的所有行,“额外”列应相同。
大胆强调我的。 一 栏。似乎您想在 两 列上形成组,但并没有按您希望的那样工作。
解决方案取决于您实际想要实现的目标。这不是您的问题,您默默地假定该功能将实现您希望的功能。
解决方案我想您想在两个主要专栏上进行分组:
(dt, instrument)。您可以使用串联或数组来玩技巧,但这会很慢和/或不可靠。我建议使用窗口函数
rank()
dense_rank()
更干净,更快速的方法,或者为 每个所需的组 生成一个 单列唯一值 。这 非常
便宜,因为排序行是主要成本,并且框架的顺序无论如何都与所需顺序相同。如果需要,可以在外部查询中删除添加的列:
SELECt dt, instrument, vol, oiFROM crosstab( $$SELECt dense_rank() OVER (ORDER BY dt, instrument) AS rnk , dt, instrument, field, value FROM marketdata.instrument_data WHERe field IN ('PX_VOLUME', 'OPEN_INT') ORDER BY 1$$ , $$VALUES ('PX_VOLUME'),('OPEN_INT')$$ ) vol(rnk int, dt date, instrument text, vol numeric, oi numeric);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)