1. 程式人生 > >【PostgreSQL】函式之百分位數&中位數:percentile_cont()

【PostgreSQL】函式之百分位數&中位數:percentile_cont()

搜尋了很久,實在沒找到pg內有關求百分數的內建函式,後來在stackoverflow中找到了建立percentile_cont函式的程式碼:



一、建立percentile_cont函式

  • 建立array_sort () <用於陣列排序>
CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL AS $$   -- 返回陣列型別

-- array_lower()返回陣列指定維度下界,array_upper()返回陣列指定維度上界,generate_series(start
, stop)生成一個數值序列,從start 到 stop 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 );
$$;
  • 建立percentile_cont()
--real單精度浮點數
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); --array_length返回陣列長度,1表示維度 row_num = 1 + ( percentile * ( ary_cnt - 1 )); -- percent*行數 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;




二、使用percentile_cont函式
使用array_agg對欄位進行陣列轉換

select percentile_cont(array_agg(col), 0.5)) 
from (
    select 2 as col
    union all
    select 3 as col
    union all
    select 6 as col
) as a
結果:3

相關推薦

PostgreSQL函式百分位數&位數percentile_cont()

搜尋了很久,實在沒找到pg內有關求百分數的內建函式,後來在stackoverflow中找到了建立percentile_cont函式的程式碼: 一、建立percentile_cont函式 建立array_sort () <用於陣列排序>

LeetCode295. 資料流的位數 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/find-median-from-data-stream/ 題目描述: 中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。 例如, [2,3,4] 的中位數是 3 [2,3] 的

DRFCRUD R(Read) - (例項場景我的部落格專欄=> 設計模式打造超級蜘蛛)

CRUD of Django-REST-Framework 之 R(Read) Overview CRUD of Django-REST-Framework 之 R(Read) 1. 例項 django ORM model 回顧 2. C

C++如何統計一個字串某個字元出現的個數?將C-風格字串作為引數的函式

目錄 預備的基礎知識  將C-風格字串作為引數的函式 C-風格字串與常規char陣列之間的區別  統計某個字串中含有字元個數的程式   預備的基礎知識  C-風格字串由一系列字元組成,以空值字元結尾('\0') 將

Pythonmmap記憶體對映模組(大文字處理)說明 mmap函式介紹

【轉】Python之mmap記憶體對映模組(大文字處理)說明 背景:       通常在UNIX下面處理文字檔案的方法是sed、awk等shell命令,對於處理大檔案受CPU,IO等因素影響,對伺服器也有一定的壓力。關於sed的說明可以看瞭解sed的工作原理,本文將

C++的const用法02----函式的引數和返回值

如果按值傳遞物件,它意味著傳遞的引數在函式中是不能被修改的。 如果按常量返回使用者定義型別的物件的值,這意味著返回值不能被修改。 如果傳遞引數並返回地址,const 將保證改地址不會被改變。 1.傳遞const  值 如果引數是按值傳遞,那麼可用const 修飾指定引數。

Python 關於Python 3.x,使用print函式時出現的語法錯誤(SyntaxError: invalid syntax)的問題的原因

原文出處:http://blog.csdn.net/u010098331/article/details/52097845 【現象】 很多Python初學者,在安裝了最新版本的Python 3.x版本,比如Python 3.2之後, 去參考別人的程式碼(基於Pyt

原始碼將一個整數的每位數分解並按逆序放入一個數組(用遞迴演算法)(C語言實現)

幫朋友做的,好像是一個面試題。如果僅僅是考察遞迴的話,應該是夠了,程式的健壯性和通用性都很一般的說…… #include <stdio.h> #include <stdlib.h&g

BLECC2541回撥函式

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編

關於Python查詢庫函式方式

首先開啟命令列輸入: python -m pydoc -p 1234ython -m pydoc表示開啟pydoc模組,這個模組就是用來檢視python文件的工具-p 1234表示在埠號1234上開啟server,這個埠號可以自行設定原文地址:https://blog.csd

筆試題攜程2018筆試[位數、]

1.中位數 有兩個有序陣列nums1和nums2,他們的大小各是m和n,請找出這兩個陣列所有數的中位數,總得時間複雜度不超過O(log(m+n)) 思路 如果對時間複雜度沒有要求,這個方法是實現起來最簡單的,我們只需要從下往上依次數(n+m)/2個

linuxcp/scp命令+scp命令詳解

特殊 是否 用戶登錄 usr 指定 highlight 顯示 檔案 三種 linux之cp/scp命令+scp命令詳解 名稱:cp 使用權限:所有使用者 使用方式: cp [options] source dest cp [options] source

c#繼承

none 實現 void 運算符重載 調用方法 需要 strong 靜態 顯式 一.繼承的類型   在面向對象的編程中,有兩種截然不同繼承類型:實現繼承和接口繼承   1.實現繼承和接口繼承   *實現繼承:表示一個類型派生於基類型,它擁有該基類型的所有成員字段和函

C#集合

tab 並發集合 get spa style con 都在 src 字典  數組(http://www.cnblogs.com/afei-24/p/6738128.html)的大小是固定的。如果元素的個數是動態的,就應使用集合類。     列表(http://www.cn

Postgresqlset up

gad linu -1 min php linux. tor article gre https://www.howtoforge.com/tutorial/ubuntu-postgresql-installation/ https://linux.cn/article

SpringSpringMVC異常處理

存儲 targe 存在 cnblogs del file 處理機制 href click java中的異常分為兩類,一種是運行時異常,一種是非運行時異常。在JavaSE中,運行時異常都是通過try{}catch{}捕獲的,這種只能捕獲顯示的異常,通常項目上拋出的異常都是不可

譯文怎樣在R語言使用SQL命令

bow all label 數據科學 eid tex 鏈接 方法 params 【譯文】怎樣在R語言中使用SQL命令 作者 Fisseha Berhane 對於有SQL背景的R語言學習者而言。sqldf是一個很實用的包,由於它使我們能在R

SpringSpringMVC攔截器

https javax request orm bin 支持 exceptio 賬號 intern Spring的HandlerMapping處理器支持攔截器應用。當需要為某些請求提供特殊功能時,例如實現對用戶進行身份認證、登錄檢查等功能。 攔截器必須實現HandlerI

SpringSpringMVCREST編程風格

data springmvc 4.0 gen rip servle truct -name insert REST架構是一個抽象的概念,目前主要是基於HTTP協議實現,其目的是為了提高系統的可伸縮性、降低應用之間的耦合度、便於架構分布式處理程序。 在URL中設置使用

22Vue Vue Devtools

rom 創建 png ins -c 擴展程序 安裝 搜索 項目 vue安裝: # 最新穩定版 $ npm install vue # 全局安裝 vue-cli $ npm install --global vue-cli # 創建一個基於 webpack 模板的新項目 $