|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 5. Operatörler ve yerleşik fonksiyonlar > 5.5 Kümeleme (aggregate) fonksiyonları |
| İmza | DISTINCT | Notlar |
|---|---|---|
COUNT(*), COUNT(v) | var | * argümanı yalnızca COUNT'ta. |
SUM(v) | var | bigint, double, decimal, number. |
AVG(v) | var | Aynı dört tip. AVG(bigint) bigint döndürür: tam sayı bölmesi. |
MIN(v), MAX(v) | yok | 10 tip: beş sayısal (int128 dışında), string, clob, date, time, timestamp. |
LISTAGG(v [, ayırıcı]) / LIST | var | Ayırıcı öndeğeri ','. Kümeleme içi sıralama iki yazımla:
LIST(v ORDER BY k) ya da WITHIN GROUP (ORDER BY k); ikisi birden yazılamaz. |
JSON_ARRAYAGG(v) | yok | Grubun değerlerinden JSON dizisi; NULL değer diziye girmez (ABSENT ON NULL); kümeleme içi ORDER BY kabul eder. |
JSON_OBJECTAGG(k, v) | yok | Grubun çiftlerinden JSON nesnesi; NULL değer null yazılır (NULL ON NULL), anahtar NULL olamaz. |
FIRST_VALUE(v), LAST_VALUE(v) | yok | |
EVERY(b) | yok | Mantıksal “hepsi doğru mu”. |
VAR_POP VAR_SAMP STDDEV_POP STDDEV_SAMP | yok | double. |
COVAR_POP COVAR_SAMP CORR(y, x) | yok | NULL içeren çiftler atılır. |
REGR_SLOPE REGR_INTERCEPT REGR_R2 REGR_AVGX REGR_AVGY REGR_SXX REGR_SYY REGR_SXY REGR_COUNT(y, x) | yok | Argüman sırası (bağımlı, bağımsız). |
ANY/SOME kümeleme fonksiyonları yoktur; adları nicelenmiş
karşılaştırma dilbilgisiyle çakışır. EVERY vardır.
PERCENTILE_CONT/PERCENTILE_DISC tanımlı değildir.
LISTAGG'ın ON OVERFLOW yan tümcesi yoktur.
WAVG bildirilmiştir ama uygulanmamıştır.
Üst seviyede (ya da bir tip/paket gövdesinde) CREATE AGGREGATE FUNCTION ile PSQL gövdeli
bir kümeleme fonksiyonu yazılabilir. Üç geçişi vardır ve üçü de aynı örneği paylaşır:
ana gövde (BEGIN … END) grup başında bir kez koşan başlatma geçişidir,
PROCEDURE AggregateIterate() her kaynak satır için koşar, FUNCTION AggregateFinish()
RETURNS <tip> sonucu üretir. Durum değişkenleri fonksiyonun yerel değişkenleridir
(öndeğerleri grup başında değerlenir); alt gövdelerin yerelleri de aynı ad uzayına girer.
CREATE [OR ALTER] AGGREGATE FUNCTION myavg(amount double, ts timestamp) [RETURNS timestamp]
AS
total double;
adat double;
PROCEDURE AggregateIterate()
AS
days double;
BEGIN
IF (amount IS NULL) THEN EXIT;
days = ts - TIMESTAMP '2000-01-01 00:00:00';
total = total + amount;
adat = adat + amount * days;
END;
FUNCTION AggregateFinish() RETURNS timestamp
AS
BEGIN
IF (total = 0) THEN RETURN NULL;
RETURN TIMESTAMP '2000-01-01 00:00:00' + (adat / total);
END;
BEGIN
total = 0;
adat = 0;
END
SELECT g, myavg(amount, ts) FROM t GROUP BY g;RETURNS yazılmazsa dönüş tipi AggregateFinish'inkidir; yazılırsa ikisi aynı olmalıdır.
Gövdede yalnız bu iki üye bulunabilir; AggregateIterate zorunludur. Bildirimde
(DISTINCT v …) yazılan fonksiyon f(DISTINCT x) ile çağrılabilir; her
kullanıcı kümelemesi OVER (…) ile pencere olarak da kullanılabilir. ALTER AGGREGATE FUNCTION
ve DROP AGGREGATE FUNCTION (= DROP FUNCTION) vardır; ALTER FUNCTION bir
kümeleme fonksiyonunu sıradan fonksiyona çevirmez. Kümeleme fonksiyonu yalnızca bir
SELECT içinde çağrılabilir. AggregateMerge (kısmi toplamların birleştirilmesi)
adıyla reddedilir: motor kısmi toplama yapmaz. SQL metnine çeviren kipler (PostgreSQL, Firebird)
kullanıcı kümelemesini reddeder.