2017-09-01 1 views
0

Ich möchte den letzten gegebenen Wert vor einem bestimmten Datum (in diesem Fall 2015-09-30) von einem BD mit on ID und 2 JSONB-Spalte, die aussieht wie folgt:letzten gegebenen Wert vor einem bestimmten Datum aus einer JSONB-Spalte

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... 
    ] 

Die Abfrage, nach der ich bin, sollte geben;

  • Id
  • Erster Wert vor dem Datum
  • , wenn das erste stock_status vor date = "instock"

Aber ich kann den Zeitstempel richtig nicht bekommen, sie alle Werte zurückgibt, bevor die Datum, wenn ein stock_status "instock" ist. Meine Frage:

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); 

Ich möchte mich das nur ein Ergebnis zurück aus der db-exemple oben geben, die mit ID 1.

Irgendwelche Tipps? Diese drived haben mich jetzt in ein paar Tagen verrückt ...

+1

Was meinst du mit der halben letzten und der ersten Hälfte. –

+0

@FahadAnjum Ich meine, dass die Hälfte der Ergebnisse stimmt mit den letzten Daten und die Hälfte dauert die ersten Daten, zB wenn der Jsonb ist '[{" value ": 4290," time ":" 2014-05-15T05: 31: 45.077483Z "}, {" value ": 3490," time ":" 2014-09-02T04: 32: 32.094733Z "}] und ein anderes ist' [{"value": 3490, "time": "2014 -09-02T04: 32: 32.094733Z "}, {" value ": 3690," time ":" 2015-01-16T04: 32: 28.679849Z "}]' das Ergebnis ist '" 2014-09-02T04: 32: 32.094733Z "' (rechts) und '" 2014-09-02T04: 32: 32.094733Z "' (falsch, sollte "2015-01-16T04: 32: 28.679849Z" sein). – Elmseld

Antwort

0

Inn am Ende habe ich es wie folgt gelöst:

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; 

Dann habe ich die Zeilen sortiert entfernt, die Outofstock und mit dem falschen Wert war in meinem Code (Elixier) statt, nicht sicher, es ist die beste Methode, aber funktioniert für mich sowieso. :)

Verwandte Themen