इस तालिका को देखते हुए (जो आपको इस तरह के रूप में प्रदान करना चाहिए था):
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 रिकॉर्ड
json_populate_recordset()
का उपयोग करें रिकॉर्डसेट को हटाने के लिए "objects"
परिणामी कॉलम के नाम और डेटा प्रकार को परिभाषित करने के लिए फ़ंक्शन को एक पंजीकृत पंक्ति प्रकार की आवश्यकता होती है। इस डेमो के प्रयोजन के लिए या आम तौर पर तदर्थ प्रश्नों के लिए, एक अस्थायी तालिका "objects"
. के बाद मॉडलिंग वही प्रदान करता है:
CREATE TEMP TABLE obj(album int, src text, pos text);
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;
प्रत्येक वस्तु मायने रखती है, चाहे वह एक ही पंक्ति से हो या नहीं। आपने यह परिभाषित नहीं किया कि इसे ठीक से कैसे संभालना है। नतीजतन, rep_id
ids
. सरणी में कई बार पॉप अप कर सकते हैं . DISTINCT
जोड़ें करने के लिए array_agg()
संभावित डुप्लिकेट को फोल्ड करने के लिए। गिनती ct
सरणी की लंबाई से अधिक हो सकती है ids
इस मामले में।
JSON फ़ंक्शंस और ऑपरेटरों के लिए पोस्टग्रेज़ 9.3 की आवश्यकता है और निहित JOIN LATERAL
।
अज्ञात या अनुवाद न करने योग्य प्रकार के JSON रिकॉर्ड
json_array_elements()
परिणाम को SQL पंक्ति में परिवर्तित किए बिना बस 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;