2017-03-07 4 views
0

J'essaie de créer une requête dans Postgres pour obtenir un résultat sous forme de tableau comme suit. L'idée est de créer une table incluant la valeur de la variable dont le nom est variableN à dateM. Au lieu de créer une liste complète avec la paire date-valeur ordonnée par nom de capteur, la sortie serait au format table.Tableau croisé dans postgres

logtime  variable1  variable2  variable3 
------------------------------------------------------ 
date1   value11  value12   value13 
date2   value21  value22   value23 

De cette façon, je me sers de la fonction tableau croisé, mais, pour moi, cette fonction est la première fois à utiliser et je n'ai pas connaissance à ce sujet. J'ai essayé plusieurs façons, mais personne ne travaille. Je serais très reconnaissant avec toute aide.

select * from crosstab(
'SELECT sensorhistdatalog.valuedate as logtime, sensorhistdatalog.value as logvalue, sensor.name FROM public.sensor 
INNER JOIN public.sensorhistdatalog 
ON sensor.id = sensorhistdatalog.sensor_id 
where sensorhistdatalog.valuedate between ''2017-03-06'' and ''2017-03-07'' 
and sensor.name in (''LHTES_ON','C_VELOCIDAD_V3_MAN','C_VELOCIDAD_V4_MAN','VELOCIDAD_V3','VELOCIDAD_V4','LHTES MODE','TEMP_COMF_W','TEMP_COMF_S', 
'TO_EXT','TO_INT','TI_EXT','TI_INT','TEMP_PLATE_1','TEMP_PLATE_2','TEMP_PLATE_3','TEMP_PLATE_4','DUMPER_1','DUMPER_2','REF_V3','REF_V4'') 
order by name, valuedate asc') 
as (
logtime text, 
logvalue text, 
name text); 

Les tables croisées sont sensorhistdatalog et le capteur, où sensorhistdatalog a plusieurs colonnes, mais nous utilisons sensor_id (qui est la clé étrangère de l'identifiant du capteur de table), la date et la valeur, principalement. Table de capteur est essentiellement la liste des capteurs avec identifiant, nom et description.

L'erreur est:

ERROR: no existing function crosstab(unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown) 
+0

Quelque chose ne va pas avec votre fonction appeler l'erreur représente ce postgres pensent qu'il devient. Vous voudrez peut-être essayer de créer une vue ou une fonction pour donner comme argument à la place – Filip

+0

je devinerais qu'il y a quelque chose qui ne va pas dans les statuts et qui sont lus par le serveur – Filip

Répondre

0
  1. pour éviter de problème avec l'utilisation de cotation $something$ pour toute requête
  2. le format de votre requête pour mieux lisibles
  3. utiliser des alias pour les tables
  4. clause AS ne décrivez le résultat de votre recherche, il doit décrire le résultat de crosstab

    SELECT * FROM crosstab (

    $$SELECT shdl.valuedate as logtime, 
          shdl.value as logvalue, 
          s.name 
         FROM public.sensor as s 
        INNER JOIN public.sensorhistdatalog as shdl 
          ON s.id = shdl.sensor_id 
         WHERE shdl.valuedate between '2017-03-06' and '2017-03-07' 
         AND s.name in ('LHTES_ON', 'C_VELOCIDAD_V3_MAN', 'C_VELOCIDAD_V4_MAN', 'VELOCIDAD_V3', 'VELOCIDAD_V4', 'LHTES MODE', 'TEMP_COMF_W', 'TEMP_COMF_S', 'TO_EXT', 'TO_INT', 'TI_EXT', 'TI_INT', 'TEMP_PLATE_1', 'TEMP_PLATE_2', 'TEMP_PLATE_3', 'TEMP_PLATE_4', 'DUMPER_1', 'DUMPER_2', 'REF_V3', 'REF_V4'') 
         ORDER BY name, valuedate asc 
        $$) 
        AS (logtime text, variable1 text, variable2 text, variable3 text);