अक्सर अनदेखी किए गए अंतर्निहित फ़ंक्शन का उपयोग करें width_bucket()
आपके एकत्रीकरण के संयोजन में:
यदि आपके निर्देशांक 0 से 2000 तक चलते हैं और आप 5 से एकल बिंदुओं के वर्गों के भीतर सब कुछ समेकित करना चाहते हैं, तो मैं इस तरह से 10 (5*2) का ग्रिड तैयार करूंगा:
SELECT device_id
, width_bucket(pos_x, 0, 2000, 2000/10) * 10 AS pos_x
, width_bucket(pos_y, 0, 2000, 2000/10) * 10 AS pos_y
, count(*) AS ct -- or any other aggregate
FROM tbl
GROUP BY 1,2,3
ORDER BY 1,2,3;
त्रुटि को कम करने के लिए आप GROUP BY
कर सकते हैं ग्रिड जैसा दिखाया गया है, लेकिन वास्तविक औसत निर्देशांक सहेजें:
SELECT device_id
, avg(pos_x)::int AS pos_x -- save actual averages to minimize error
, avg(pos_y)::int AS pos_y -- cast if you need to
, count(*) AS ct -- or any other aggregate
FROM tbl
GROUP BY
device_id
, width_bucket(pos_x, 0, 2000, 2000/10) * 10 -- aggregate by grid
, width_bucket(pos_y, 0, 2000, 2000/10) * 10
ORDER BY 1,2,3;
sqlfiddle दोनों को साथ-साथ प्रदर्शित करता है।
खैर, यह विशेष मामला आसान हो सकता है:
...
GROUP BY
device_id
, (pos_x / 10) * 10 -- truncates last digit of an integer
, (pos_y / 10) * 10
...
लेकिन ऐसा सिर्फ इसलिए है क्योंकि 10
. का डेमो ग्रिड आकार आसानी से दशमलव प्रणाली से मेल खाता है। 17
. के ग्रिड आकार के साथ भी ऐसा ही करें या कुछ ...
टाइमस्टैम्प तक विस्तृत करें
आप date
. को कवर करने के लिए इस दृष्टिकोण का विस्तार कर सकते हैं और timestamp
एक्सट्रेक्ट() के साथ उन्हें यूनिक्स युग ('1970-1-1' के बाद से सेकंड की संख्या) में परिवर्तित करके मान।
SELECT extract(epoch FROM '2012-10-01 21:06:38+02'::timestamptz);
जब आप कर लें, तो परिणाम को वापस timestamp with time zone
. में बदलें :
SELECT timestamptz 'epoch' + 1349118398 * interval '1s';
या बस to_timestamp()
:
SELECT to_timestamp(1349118398);