2017-09-01 2 views
0

Je veux obtenir la dernière valeur donnée avant une date spécifique (dans ce cas 2015-09-30) à partir d'un BD avec ID et 2 colonnes JSONB qui semblent comme ceci:dernière valeur donnée avant une date spécifique d'une colonne JSONB

1, 
[ 
    {"value": 4290, "time": "2014-05-15T05:31:45.077483Z"}, 
    {"value": 3490, "time": "2014-09-02T04:32:32.094733Z"}, 
    {"value": 3690, "time": "2015-01-16T04:32:28.679849Z"}, etc... 
    ], 
[ 
    {"stock_status": "instock", "time": "2014-06-15T05:31:45.077483Z"}, 
    {"stock_status": "outofstock", "time": "2014-07-02T04:32:32.094733Z"}, 
    {"stock_status": "instock", "time": "2015-01-26T04:32:28.679849Z"}, etc... 
    ], 
2, 
[ 
    {"value": 4598, "time": "2013-05-15T05:31:45.077483Z"}, 
    {"value": 3456, "time": "2014-04-02T04:32:32.094733Z"}, 
    {"value": 4354, "time": "2015-06-16T04:32:28.679849Z"}, etc... 
    ] 
[ 
    {"stock_status": "outofstock", "time": "2014-06-15T05:31:45.077483Z"}, 
    {"stock_status": "instock", "time": "2014-07-02T04:32:32.094733Z"}, 
    {"stock_status": "outofstock", "time": "2015-01-26T04:32:28.679849Z"}, etc... 
    ] 

La requête que je suis après devrait donner;

  • Id
  • Première valeur avant la date
  • si la première stock_status avant la date = "instock"

Mais je ne peux pas les horodatages droite, il rend toutes les valeurs avant la date si any stock_status est "instock". Ma Recherche:

SELECT sph.id, elem1->>'value', elem1->>'time' 
    FROM table as sph, 
    jsonb_array_elements(sph.value_column) as array1(elem1), 
    jsonb_array_elements(sph.stock_status_coulmn) as array2(elem2) 

     where elem1 = (select elem1 
    where elem1->> 'time' <= '2015-09-30' and elem2->> 'time' <= '2015-09-30' and elem2->>'stock_status' = 'instock' 
order by elem1->>'time' desc 
limit 1); 

Je veux que cela me donne un seul résultat en retrait de la db-dessus exemple, celui avec id 1.

Des conseils? Ce sont me drived fou dans quelques jours maintenant ...

+1

Que voulez-vous dire par la moitié et la moitié d'abord. –

+0

@FahadAnjum Je veux dire que la moitié des résultats est juste avec les dernières dates et la moitié prend les premières dates, par exemple si le jsonb est '[{" value ": 4290," time ":" 2014-05-15T05: 31: 45.077483Z "}, {" value ": 3490," time ":" 2014-09-02T04: 32: 32.094733Z "}]' et un autre est '[" "value": 3490, "time": "2014 -09-02T04: 32: 32.094733Z "}, {" value ": 3690," time ":" 2015-01-16T04: 32: 28.679849Z "}]' le résultat est '" 2014-09-02T04: 32: 32.094733Z "' (droite) et '" 2014-09-02T04: 32: 32.094733Z "' (faux, devrait être "2015-01-16T04: 32: 28.679849Z"). – Elmseld

Répondre

0

Inn la fin je l'ai résolu comme ceci:

SELECT DISTINCT ON (sph.id) sph.id, elem1->>'value' as value, elem1->>'time' as time, elem2->>'stock_status' as stock_status 
    FROM table as sph 
    join table2 as sp on sph.id = sp.id, 
    jsonb_array_elements(sph.value_column) as array1(elem1), 
    jsonb_array_elements(sph. stock_status_coulmn) as array2(elem2) 

    WHERE elem1#>>'{time}' <= '2015-09-30' and elem2#>>'{time}' <= '2015-09-30' 
ORDER BY sph.id, elem1#>>'{time}' DESC, elem2#>>'{time}' DESC; 

Je triai loin les lignes qui était Outofstock et avec la mauvaise valeur dans mon code (elixir) à la place, je ne suis pas sûr que ce soit la meilleure méthode mais ça marche pour moi quand même. :)