5.5 Kümeleme (aggregate) fonksiyonları

<< İç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ı

İmzaDISTINCTNotlar
COUNT(*), COUNT(v)var* argümanı yalnızca COUNT'ta.
SUM(v)varbigint, double, decimal, number.
AVG(v)varAynı dört tip. AVG(bigint) bigint döndürür: tam sayı bölmesi.
MIN(v), MAX(v)yok10 tip: beş sayısal (int128 dışında), string, clob, date, time, timestamp.
LISTAGG(v [, ayırıcı]) / LISTvarAyı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)yokGrubun değerlerinden JSON dizisi; NULL değer diziye girmez (ABSENT ON NULL); kümeleme içi ORDER BY kabul eder.
JSON_OBJECTAGG(k, v)yokGrubun ç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)yokMantıksal “hepsi doğru mu”.
VAR_POP VAR_SAMP STDDEV_POP STDDEV_SAMPyokdouble.
COVAR_POP COVAR_SAMP CORR(y, x)yokNULL 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)yokArgüman sırası (bağımlı, bağımsız).
Sınır

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.

5.5.1 Kullanıcı tanımlı kümeleme fonksiyonu

Ü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.