我目前有m
以下格式的表格:
id scenario period ct
2 1 1 1
2 1 2 1
2 1 3 1
2 1 4 1
2 2 1 1
2 2 2 1
2 2 3 1
2 2 4 1
2 3 1 1
2 3 2 1
2 3 3 1
2 3 4 1
我要创建下表:
id scenario period 1 2 3 4
2 1 1 1
2 1 2 1
2 1 3 1
2 1 4 1
2 2 1 1
2 2 2 1
2 2 3 1
2 2 4 1
2 3 1 1
2 3 2 1
2 3 3 1
2 3 4 1
tablefunc扩展名已经在我的Postgres数据库中创建。我目前正在尝试使用该crosstab()
功能来完成数据透视。但是,我得到的表如下所示:
id scenario period 1 2 3 4
2 1 1 1 1 1 1
我试过的查询:
SELECT * FROM crosstab(
'SELECT id, scenario, period, ct FROM m
ORDER BY 1',
'SELECT DISTINCT period FROM m
ORDER BY 1')
AS (id, scenario, period, 1, 2, 3, 4);
此查询生成所需的输出:
SELECT id, scenario, period, p1, p2, p3, p4 -- all except aux column rn
FROM crosstab(
'SELECT row_number() OVER (ORDER BY id, scenario, period)::int AS rn
, id, scenario, period, period, ct
FROM m
ORDER BY 1'
, 'VALUES (1), (2), (3), (4)'
) AS (rn int, id int, scenario int, period int, p1 int, p2 int, p3 int, p4 int);
两个特殊的困难:
您还没有 row_name的 唯一列。我row_number()
用来生成代理密钥:rn
。我从外部将其删除,SELECT
以符合您期望的结果。
您尝试的方式id
被视为 row_name ,所有输入行都汇总到单个输出行中。
您需要结果中的其他列(scenario
和period
),这些列必须在 row_name之后 和 category 之前。您必须列出period
两次 才能另外获得原始列-看起来似乎很多余。
基本:
与此特定情况有关:
通常,您会有这样的查询:
SELECT id, scenario, p1, p2, p3, p4 -- all except aux column rn
FROM crosstab(
'SELECT rank() OVER (ORDER BY id, scenario)::int AS rn
, id, scenario, period, ct
FROM m
ORDER BY 1'
, 'VALUES (1), (2), (3), (4)'
) AS (rn int, id int, scenario int, p1 int, p2 int, p3 int, p4 int);
输出如下:
id scenario p1 p2 p3 p4
2 1 1 1 1 1
2 2 1 1 1 1
2 3 1 1 1 1
请注意,使用rank()
而不是row_number()
将相同的组合组合(id, scenario)
在一起。
如果计数不是全部,则结果更有意义1
。
我在下面有一个函数,它的目的是返回第一个索引,其中数据不是按升序排序的。如果对数据进行排序,它将只返回数组的长度。例如,{10,20,90,5,70}将返回3(90 测试用例:
问题内容: 我有一个通用的“ Dimension”和“ DimensionMember”表。 这些表存储大量维和维成员。 我想从可变数量的维中交叉连接维成员。示例:“性别”,“就业类型”,“合同类型”维度中的交叉联接维度成员应产生以下组合 组合的标签应通过连接维度成员的标签来创建(如上所示)。 先感谢您 更新 维度列表(例如“性别”,“就业类型”,“合同类型”)是DYNAMIC(由运行时的另一个查
我正在使用Jooq的和方法将一些数据添加到Postgres表中。以后我想知道我的数据中有多少重复项,因此如果插入或更新了一行,就需要返回。 根据我到目前为止对postgres的具体研究,我发现是一个有效的选项。但是,从jOOQ中自动生成的Java表类似乎不能让我访问像Xmax这样的postgres的系统列。 我已经重新检查了Maven jOOQ表生成配置,并且不排除任何列。我也在Jooq自己的网站
我正在尝试构建一个满足以下标准的简单函数(需要使用Hasura API fwiw链接) 这就是功能 我得到了错误:。当我使用,或时,我得到了相同的错误
我必须并行运行多个期货,程序不应该崩溃或挂起。 目前,我一个接一个地等待期货,如果存在TimeoutException,则使用回退值。 如我所见,这个代码片段的最大等待时间是< code > time out 1 time out 2 time out 3 我的问题是:我怎么能同时等待所有这些期货,这样我就可以将等待时间减少到? 编辑:最后我用了@Jatin和@senia的修改答案: 后来它使用如
问题内容: 我们有一个表格,其形式为: 我们需要将其转化为。 是否有一个聪明的方法可以在一个SELECT语句中执行此操作(即不使用UNION)?列名称Value1,Value2和Value3是固定的且恒定的。 该数据库是oracle 9i。 问题答案: 这适用于Oracle 10g: 我认为Oracle 9i有递归查询吗?无论如何,我非常确定它具有CASE支持,因此即使它没有递归查询,也可以执行“