将行式 postgres 数据转换为分组的列式数据
Transform row wise postgres data to grouped column wise data
我有一个类似于
的股市数据
instrument_symbol|close |timestamp |
-----------------|------|-------------------|
IOC |134.15|2019-08-05 00:00:00|
YESBANK | 83.75|2019-08-05 00:00:00|
IOC |135.25|2019-08-02 00:00:00|
YESBANK | 88.3|2019-08-02 00:00:00|
IOC |136.95|2019-08-01 00:00:00|
YESBANK | 88.4|2019-08-01 00:00:00|
IOC | 139.3|2019-07-31 00:00:00|
YESBANK | 91.2|2019-07-31 00:00:00|
YESBANK | 86.05|2019-07-30 00:00:00|
IOC | 133.5|2019-07-30 00:00:00|
IOC |138.25|2019-07-29 00:00:00|
我想将其转换为
timestamp, IOC, YESBANK
2019-08-05 00:00:00 134.15 83.75
2019-08-02 00:00:00 135.25 88.3
......
.....
...
格式。
是否有一些 Postgres 查询可以做到这一点?还是我们必须以编程方式执行此操作?
使用条件聚合。
select "timestamp" :: date, max( case
when instrument_symbol = 'IOC'
then close end ) as ioc,
max( case
when instrument_symbol = 'YESBANK'
then close end ) as yesbank FROM t
group by "timestamp" :: date
order by 1 desc
您可以使用条件聚合。在 Postgres 中,我喜欢 filter
语法:
select "timestamp",
max(close) filter (where instrument_symbol = 'IOC') as ioc,
max(close) filter (where instrument_symbol = 'YESBANK') as yesbank
from t
group by "timestamp"
order by 1 desc;
我有一个类似于
的股市数据instrument_symbol|close |timestamp |
-----------------|------|-------------------|
IOC |134.15|2019-08-05 00:00:00|
YESBANK | 83.75|2019-08-05 00:00:00|
IOC |135.25|2019-08-02 00:00:00|
YESBANK | 88.3|2019-08-02 00:00:00|
IOC |136.95|2019-08-01 00:00:00|
YESBANK | 88.4|2019-08-01 00:00:00|
IOC | 139.3|2019-07-31 00:00:00|
YESBANK | 91.2|2019-07-31 00:00:00|
YESBANK | 86.05|2019-07-30 00:00:00|
IOC | 133.5|2019-07-30 00:00:00|
IOC |138.25|2019-07-29 00:00:00|
我想将其转换为
timestamp, IOC, YESBANK
2019-08-05 00:00:00 134.15 83.75
2019-08-02 00:00:00 135.25 88.3
......
.....
...
格式。
是否有一些 Postgres 查询可以做到这一点?还是我们必须以编程方式执行此操作?
使用条件聚合。
select "timestamp" :: date, max( case
when instrument_symbol = 'IOC'
then close end ) as ioc,
max( case
when instrument_symbol = 'YESBANK'
then close end ) as yesbank FROM t
group by "timestamp" :: date
order by 1 desc
您可以使用条件聚合。在 Postgres 中,我喜欢 filter
语法:
select "timestamp",
max(close) filter (where instrument_symbol = 'IOC') as ioc,
max(close) filter (where instrument_symbol = 'YESBANK') as yesbank
from t
group by "timestamp"
order by 1 desc;