आपका (सरलीकृत!) फ़ंक्शन इस तरह दिख सकता है:
CREATE OR REPLACE FUNCTION my_custom_grouping(integer)
RETURNS TABLE (
grp integer,
col1 double precision,
col2 double precision,
col3 double precision,
col4 double precision,
col5 double precision,
col6 double precision,
col7 double precision) AS
$BODY$
SELECT ceil(rank() OVER (ORDER BY col1) / $1)::int as grp
,col1, col2, col3, col4, col5, col6, col7
FROM mytable
ORDER BY 1;
$BODY$ LANGUAGE SQL;
प्रमुख बिंदु:
-
ध्यान दें कि यह
language SQL
है , इसलिए PL/pgSQL फ़ंक्शन नहीं है। आपlanguage plpgsql
का प्रयोग कर सकते हैं , भी, लेकिन यह यहाँ आवश्यक नहीं है। -
मैंने आपके वूडू के मूल को विंडो फ़ंक्शन
rank()
, जो बिल्कुल वैसा ही करना चाहिए, बस सरल। -
मैंने सबक्वायरी को भी पूरी तरह से हटा दिया। यह आवश्यक नहीं है।
-
टाइप
double
कहा जाता हैdouble precision
PostgreSQL में। -
एकाधिक पंक्तियों को वापस करने के लिए, फ़ंक्शन को
RETURNS SETOF record
के रूप में परिभाषित करें याRETURNS TABLE
जैसा मैंने किया। -
ORDER BY
स्थितीय मापदंडों का उपयोग कर सकते हैं, इसलिए आपको पहले कॉलम की गणना को फिर से लिखने की आवश्यकता नहीं है:ORDER BY 1
.
हालाँकि, एक हीgrp
. में अनेक पंक्तियाँ .ORDER BY
. में और कॉलम या एक्सप्रेशन जोड़ें एक स्थिर सॉर्ट ऑर्डर पर पहुंचने के लिए क्लॉज।