I have a query in Postgres. It’s working well and returns exactly the rows I’m looking for.
Here’s the query:
select distinct on (status) id, status, timestamp from my_table where id = 1 order by status, timestamp limit 500
This is what it returns:
id | status | timestamp |
---|---|---|
1 | started | 2022-01-15 05:12:36 |
1 | paused | 2022-04-14 09:12:50 |
1 | killed | 2022-04-27 13:12:48 |
How can I pivot this table to return this exactly:
id | started | paused | killed |
---|---|---|---|
1 | 2022-01-15 05:12:36 | 2022-04-14 09:12:50 | 2022-04-27 13:12:48 |
Advertisement
Answer
You could use the extension tablefunc, but it looks like a simple aggregate using a filter already works:
SELECT id , MIN(timestamp) FILTER (WHERE status = 'started') AS started , MIN(timestamp) FILTER (WHERE status = 'paused') AS paused , MIN(timestamp) FILTER (WHERE status = 'killed') AS killed FROM my_table WHERE id = 1 GROUP BY id;