sql >> Database teknologi >  >> RDS >> PostgreSQL

Forespørgselskombinationer med indlejret matrix af poster i JSON-datatype

Givet denne tabel (som du skulle have angivet i en formular som denne):

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"}')
;

JSON-registreringer af velkendt, oversættelig type

Brug json_populate_recordset() for at fjerne postsættet "objects" . Funktionen kræver en registreret rækketype for at definere navnene og datatyperne for resulterende kolonner. Til formålet med denne demo eller generelt til ad hoc-forespørgsler, en temp-tabel modelleret efter "objects" giver det samme:

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

For at finde 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;

Hvert objekt tæller, uanset om det er fra samme række eller ej. Du definerede ikke præcis, hvordan du skulle håndtere det. Derfor rep_id kan dukke op flere gange i arrayet ids . Tilføj DISTINCT til array_agg() at folde mulige dubletter. Antal ct kan være større end længden af ​​arrayet ids i dette tilfælde.

Kræver Postgres 9.3 for JSON-funktionerne og -operatørerne og den implicitte JOIN LATERAL .

JSON-poster af ukendt eller uoversættelig type

json_array_elements() fjerner bare json-arrayet uden at transformere resultatet til en SQL-række. Få adgang til individuelle felter med JSON-operatører i overensstemmelse hermed.

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. Hash deltage i Oracle med eksempel

  2. MySQL IF() Funktion forklaret

  3. SQL Server - Hvad sker der, når en række i en tabel opdateres?

  4. 5 kraftfulde funktioner i Microsoft Access