在SQL中重塑数据

在SQL中重塑数据,sql,postgresql,pivot,Sql,Postgresql,Pivot,我有一张简单的桌子,像 time_stamp, metric, value 2012/3/2 , x , 1 2012/3/2 , y , 1.6 2012/3/3 , x , 0 2012/3/3 , y , null ... 我想写一个查询,返回如下内容 time_stamp, x, y 2012/3/2 , 1, 1.6 2012/3/3 , 0, null 换言之,基本上是根据一个字段的唯一值动态生成列,并将数据重塑为该字段 我记得

我有一张简单的桌子,像

time_stamp, metric, value
2012/3/2  , x     , 1
2012/3/2  , y     , 1.6
2012/3/3  , x     , 0
2012/3/3  , y     , null
...
我想写一个查询,返回如下内容

time_stamp, x, y
2012/3/2  , 1, 1.6
2012/3/3  , 0, null    
换言之,基本上是根据一个字段的唯一值动态生成列,并将数据重塑为该字段

我记得我在什么地方见过它,但我现在就是找不到

另外,我现在正在使用PostgreSQL。请注意,该解决方案是否特定于特定的DBMS

更新:从中形成列的度量值是动态的。我知道这会让这变得更难,而且一个单一的查询解决方案几乎是不可能的


根据评论,我也尝试过交叉表,它是a)非常特定于pg,b)不太适合动态表数。

使用
条件聚合
转换行

select time_stamp,
      max(case when metric= 'X' then value End) as X, 
      max(case when metric= 'Y' then value End) as Y, 
From Yourtable
group by time_stamp

使用
条件聚合
转置行

select time_stamp,
      max(case when metric= 'X' then value End) as X, 
      max(case when metric= 'Y' then value End) as Y, 
From Yourtable
group by time_stamp

它叫做PIVOT,我不知道Postgres是否有内置函数。包括返回数据透视表的函数。表的结构是什么?(CREATE TABLE语句){time_stamp,metric}的组合是唯一的吗?@MikeSherrill'CatRecall'比这更复杂,简短的回答是,它们不是唯一的(但可以通过查询使其唯一)。如果{time_stamp,metric}不是唯一的,你如何选择要包含在结果集中的值?它被称为PIVOT,我不知道Postgres是否有内置的功能。包括返回数据透视表的函数。表的结构是什么?(CREATE TABLE语句){time_stamp,metric}的组合是否唯一?@MikeSherrill'CatRecall'比这更复杂,简短的回答是,它们不是唯一的(但可以通过查询使其唯一)。如果{time_stamp,metric}不是唯一的,如何选择要包含在结果集中的值?