在SQL查询中将数据重新排列为多列
我正在从数据库中提取timeseries数据,WARE数据按行存储,还存储了一个类型字段。(即,该表具有时间戳、数据类型和值字段) 数据中有固定数量的不同数据类型,我需要将每种数据类型作为一列进行结构化在SQL查询中将数据重新排列为多列,sql,oracle,group-by,pivot,aggregation,Sql,Oracle,Group By,Pivot,Aggregation,我正在从数据库中提取timeseries数据,WARE数据按行存储,还存储了一个类型字段。(即,该表具有时间戳、数据类型和值字段) 数据中有固定数量的不同数据类型,我需要将每种数据类型作为一列进行结构化 Timestamp Offset Multi Value Output ------------------------------------------- 2019-07-22 0,7047 0,9805 6,6526 1,1223 2019-07-23 0,7005
Timestamp Offset Multi Value Output
-------------------------------------------
2019-07-22 0,7047 0,9805 6,6526 1,1223
2019-07-23 0,7005 0,9850 6,6955 1,1150
2019-07-24 0,6980 0,9855 6,6995 1,1143
这可以在SQL查询中执行吗
我希望在查询中执行此操作的原因是,我在应用程序界面中运行查询,然后将结果输出到一个表中,该表可以复制粘贴到工具中,而无需手动重新排列。(也就是说,我不是作为程序的一部分执行查询,因此我不能在SQL查询之外的任何代码中执行查询)如果列数是固定的,您可以使用CASE-pivot方法-
SELECT Timestamp
,MAX(CASE WHEN Type = 'Offset' THEN Value END) Offset
,MAX(CASE WHEN Type = 'Multi' THEN Value END) Multi
,MAX(CASE WHEN Type = 'Value' THEN Value END) Value
,MAX(CASE WHEN Type = 'Output' THEN Value END) Output
FROM YOUR_TABLE
GROUP BY Timestamp;
您可以使用条件聚合:
select Timestamp,
max(case when Type = 'Offset' Then Value end) as Offset,
max(case when Type = 'Multi' Then Value end) as Multi,
max(case when Type = 'Value' Then Value end) as Value,
max(case when Type = 'Output' Then Value end) as Output
from tab
group by Timestamp
order by Timestamp;
另一个选项是使用带有pivot
关键字的查询:
select *
from
(
select *
from tab
)
pivot(
max(value) for Type in ( 'Offset' as "Offset", 'Multi' as "Multi",
'Value' as "Value", 'Output' as "Output" )
)
order by Timestamp;
如果时间戳列具有分数时间分量,并且希望将其截断为秒,则如下所示:
SELECT cast (systimestamp as date) ddate
,MAX(DECODE (Type, 'Offset', Value)) Offset
,MAX(DECODE (Type, 'Multi', Value)) Multi
,MAX(DECODE (Type, 'Value', Value)) Value
,MAX(DECODE (Type, 'Output', Value)) Output
FROM YOUR_TABLE
GROUP BY cast (systimestamp as date);
按时间戳分组,选择列表中多个etc的用例表达式。
SELECT cast (systimestamp as date) ddate
,MAX(DECODE (Type, 'Offset', Value)) Offset
,MAX(DECODE (Type, 'Multi', Value)) Multi
,MAX(DECODE (Type, 'Value', Value)) Value
,MAX(DECODE (Type, 'Output', Value)) Output
FROM YOUR_TABLE
GROUP BY cast (systimestamp as date);