sql >> Databáze >  >> RDS >> PostgreSQL

Kombinace dotazů s vnořeným polem záznamů v datovém typu JSON

Vzhledem k této tabulce (kterou byste měli poskytnout ve formě, jako je tato):

CREATE TABLE reports (rep_id int primary key, data json);
INSERT INTO reports (rep_id, data)
VALUES 
  (1, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 2, "src":"barB.png", "pos": "top"}],   "background":"background.png"}')
, (2, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 2, "src":"barC.png", "pos": "top"}],   "background":"bacakground.png"}')
, (3, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "middle"},{"album": 2, "src":"barB.png", "pos": "middle"}],"background":"background.png"}')
, (4, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 3, "src":"barB.png", "pos": "top"}],   "background":"backgroundA.png"}')
;

Záznamy JSON dobře známého, přeložitelného typu

Použijte json_populate_recordset() pro zrušení vnoření sady záznamů "objects" Funkce vyžaduje registrovaný typ řádku k definování názvů a datových typů výsledných sloupců. Pro účely této ukázky nebo obecně pro ad-hoc dotazy dočasná tabulka po vzoru "objects" poskytuje totéž:

CREATE TEMP TABLE obj(album int, src text, pos text);

Chcete-li najít the top 3 most common combinations ... of entries that have the same album, src, and background :

SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM   reports r
     , json_populate_recordset(null::obj, r.data->'objects') o
GROUP  BY r.data->>'background'
        , o.album
        , o.scr
ORDER  BY count(*) DESC
LIMIT  3;

Každý objekt se počítá, bez ohledu na to, zda je ze stejného řádku nebo ne. Nedefinoval jsi přesně, jak to řešit. Následně rep_id může vyskakovat vícekrát v poli ids . Přidejte DISTINCT na array_agg() skládat možné duplikáty. Počet ct může být větší než délka pole ids v tomto případě.

Vyžaduje Postgres 9.3 pro funkce a operátory JSON a implicitní JOIN LATERAL .

Záznamy JSON neznámého nebo nepřeložitelného typu

json_array_elements() pouze zruší vnoření pole json bez transformace výsledku na řádek SQL. Podle toho přistupujte k jednotlivým polím pomocí operátorů JSON.

SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM   reports r
     , json_array_elements(r.data->'objects') o
GROUP  BY r.data->>'background'
        , o->>'album'
        , o->>'scr'
ORDER  BY count(*) DESC
LIMIT  3;



  1. Uložte databázi mysql do zálohy ve formátu prostého textu (CSV) z příkazového řádku

  2. Zkontrolujte, zda jsou dva výběry ekvivalentní

  3. Jak zobrazit komentáře sloupce s operací desc

  4. 1114 (HY000):Tabulka je plná