I'm new to PostgreSQL and am using version 9.4. I'm having a table with collected measurements as strings and need to convert it to a kind of PIVOT table using something which is always up-to-date, like a VIEW.
Furthermore, some values need to be converted, e. g. multiplied by 1000, as you can see in the example below for "sensor3".
Source Table:
CREATE TABLE source ( id bigint NOT NULL, name character varying(255), "timestamp" timestamp without time zone, value character varying(32672), CONSTRAINT source_pkey PRIMARY KEY (id) ); INSERT INTO source VALUES (15,'sensor2','2015-01-03 22:02:05.872','88.4') , (16,'foo27' ,'2015-01-03 22:02:10.887','-3.755') , (17,'sensor1','2015-01-03 22:02:10.887','1.1704') , (18,'foo27' ,'2015-01-03 22:02:50.825','-1.4') , (19,'bar_18' ,'2015-01-03 22:02:50.833','545.43') , (20,'foo27' ,'2015-01-03 22:02:50.935','-2.87') , (21,'sensor3','2015-01-03 22:02:51.044','6.56'); Source Table Result:
| id | name | timestamp | value | |----+-----------+---------------------------+----------| | 15 | "sensor2" | "2015-01-03 22:02:05.872" | "88.4" | | 16 | "foo27" | "2015-01-03 22:02:10.887" | "-3.755" | | 17 | "sensor1" | "2015-01-03 22:02:10.887" | "1.1704" | | 18 | "foo27" | "2015-01-03 22:02:50.825" | "-1.4" | | 19 | "bar_18" | "2015-01-03 22:02:50.833" | "545.43" | | 20 | "foo27" | "2015-01-03 22:02:50.935" | "-2.87" | | 21 | "sensor3" | "2015-01-03 22:02:51.044" | "6.56" | Desired Final Result:
| timestamp | sensor1 | sensor2 | sensor3 | foo27 | bar_18 | |---------------------------+---------+---------+---------+---------+---------| | "2015-01-03 22:02:05.872" | | 88.4 | | | | | "2015-01-03 22:02:10.887" | 1.1704 | | | -3.755 | | | "2015-01-03 22:02:50.825" | | | | -1.4 | | | "2015-01-03 22:02:50.833" | | | | | 545.43 | | "2015-01-03 22:02:50.935" | | | | -2.87 | | | "2015-01-03 22:02:51.044" | | | 6560.00 | | | Using this:
-- CREATE EXTENSION tablefunc; SELECT * FROM crosstab( 'SELECT source."timestamp", source.name, source.value FROM public.source ORDER BY 1' , 'SELECT DISTINCT source.name FROM public.source ORDER BY 1' ) AS ( "timestamp" timestamp without time zone, "sensor1" character varying(32672), "sensor2" character varying(32672), "sensor3" character varying(32672), "foo27" character varying(32672), "bar_18" character varying(32672) ) ; I got the result:
| timestamp | sensor1 | sensor2 | sensor3 | foo27 | bar_18 | |---------------------------+---------+---------+---------+---------+---------| | "2015-01-03 22:02:05.872" | | | | 88.4 | | | "2015-01-03 22:02:10.887" | | -3.755 | 1.1704 | | | | "2015-01-03 22:02:50.825" | | -1.4 | | | | | "2015-01-03 22:02:50.833" | 545.43 | | | | | | "2015-01-03 22:02:50.935" | | -2.87 | | | | | "2015-01-03 22:02:51.044" | | | | | 6.56 | Unfortunately,
- the values aren't assigned to the correct column,
- the columns aren't dynamic; that means the query fails when there is an additional entry in the name column like 'sensor4' and
- I don't know how to change the values of some columns (multiply).
varchar(32672)why notfloatornumeric?