Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle के PERCENTILE_CONT फ़ंक्शन के बराबर PostgreSQL

अधिक खोज के बाद मुझे एक ऐसा पृष्ठ मिला जिसमें छद्म कोड सूचीबद्ध था कि कैसे Oracle इस फ़ंक्शन को यहां लागू करता है:

http://docs.oracle.com/cd/B19306_01 /server.102/b14200/functions110.htm

मैंने Oracle के फीचर की नकल करने के लिए PG के भीतर अपना खुद का फंक्शन लिखने का फैसला किया।

मुझे डेविड फ़ेटर द्वारा ::

. पर एक सरणी छँटाई तकनीक मिली

http://postgres.cz/wiki/PostgreSQL_SQL_Tricks#General_array_sort

और

सरणी तत्वों को क्रमित करना

यहाँ (स्पष्टता के लिए) डेविड का कोड है:

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
AS $$
SELECT ARRAY(
    SELECT $1[s.i] AS "foo"
    FROM
        generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY foo
);
$$;

तो यहाँ वह कार्य है जो मैंने लिखा है:

CREATE OR REPLACE FUNCTION percentile_cont(myarray real[], percentile real)
RETURNS real AS
$$

DECLARE
  ary_cnt INTEGER;
  row_num real;
  crn real;
  frn real;
  calc_result real;
  new_array real[];
BEGIN
  ary_cnt = array_length(myarray,1);
  row_num = 1 + ( percentile * ( ary_cnt - 1 ));
  new_array = array_sort(myarray);

  crn = ceiling(row_num);
  frn = floor(row_num);

  if crn = frn and frn = row_num then
    calc_result = new_array[row_num];
  else
    calc_result = (crn - row_num) * new_array[frn] 
            + (row_num - frn) * new_array[crn];
  end if;

  RETURN calc_result;
END;
$$
  LANGUAGE 'plpgsql' IMMUTABLE;

यहां कुछ तुलना परीक्षण के परिणाम दिए गए हैं:

CREATE TABLE testdata
(
  intcolumn bigint,
  fltcolumn real
);

यहाँ परीक्षण डेटा है:

insert into testdata(intcolumn, fltcolumn)  values  (5, 5.1345);
insert into testdata(intcolumn, fltcolumn)  values  (195, 195.1345);
insert into testdata(intcolumn, fltcolumn)  values  (1095, 1095.1345);
insert into testdata(intcolumn, fltcolumn)  values  (5995, 5995.1345);
insert into testdata(intcolumn, fltcolumn)  values  (15, 15.1345);
insert into testdata(intcolumn, fltcolumn)  values  (25, 25.1345);
insert into testdata(intcolumn, fltcolumn)  values  (495, 495.1345);
insert into testdata(intcolumn, fltcolumn)  values  (35, 35.1345);
insert into testdata(intcolumn, fltcolumn)  values  (695, 695.1345);
insert into testdata(intcolumn, fltcolumn)  values  (595, 595.1345);
insert into testdata(intcolumn, fltcolumn)  values  (35, 35.1345);
insert into testdata(intcolumn, fltcolumn)  values  (30195, 30195.1345);
insert into testdata(intcolumn, fltcolumn)  values  (165, 165.1345);
insert into testdata(intcolumn, fltcolumn)  values  (65, 65.1345);
insert into testdata(intcolumn, fltcolumn)  values  (955, 955.1345);
insert into testdata(intcolumn, fltcolumn)  values  (135, 135.1345);
insert into testdata(intcolumn, fltcolumn)  values  (19195, 19195.1345);
insert into testdata(intcolumn, fltcolumn)  values  (145, 145.1345);
insert into testdata(intcolumn, fltcolumn)  values  (85, 85.1345);
insert into testdata(intcolumn, fltcolumn)  values  (455, 455.1345);

यहां तुलना के परिणाम दिए गए हैं:

ORACLE RESULTS
ORACLE RESULTS

select  percentile_cont(.25) within group (order by fltcolumn asc) myresult
from testdata;
select  percentile_cont(.75) within group (order by fltcolumn asc) myresult
from testdata;

myresult
- - - - - - - -
57.6345                

myresult
- - - - - - - -
760.1345               

POSTGRESQL RESULTS
POSTGRESQL RESULTS

select percentile_cont(array_agg(fltcolumn), 0.25) as myresult
from testdata;

select percentile_cont(array_agg(fltcolumn), 0.75) as myresult
from testdata;

myresult
real
57.6345

myresult
real
760.135

मुझे आशा है कि यह पहिया को फिर से आविष्कार न करके किसी की मदद करेगा।

आनंद लें!रे हैरिस



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सीआरएस 11.2.0

  2. -Xss और -XX के बीच क्या अंतर है:थ्रेडस्टैक आकार?

  3. Oracle डेटाबेस कॉन्फ़िगरेशन सहायक का उपयोग करके खाली डेटाबेस बनाएँ

  4. SQLRecoverableException:I/O अपवाद:कनेक्शन रीसेट

  5. Oracle में इसके बाहर किसी प्रक्रिया के परिणाम कैसे प्रदर्शित करें?