按分の比率を求めるSQL

以下のようなテーブルがあるとき、

CREATE TABLE worktables (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    wname varchar(32) NOT NULL,
    ktype NUMERIC NOT NULL,
    point NUMERIC DEFAULT 0 NOT NULL,
    at_create date NOT NULL,
    CONSTRAINT worktables_pkey PRIMARY KEY (id)
);

データが以下のように格納されている。

OVER関数を使わずにGROUP BY で求める集計値のサブクエリ使う方法、

全ての point合計値で比率を求める

SELECT
    a.id, 
    a.wname,
    a.ktype,
    a.at_create,
    a.point, 
    b.point_amount,
    ROUND(a.point / b.point_amount, 5) AS point_ratio
FROM worktables a,
(SELECT SUM(point) AS point_amount FROM worktables) b

ktype別の point合計値で比率を求める

SELECT
    a.id, 
    a.wname,
    a.ktype,
    a.at_create,
    a.point, 
    b.point_amount,
    ROUND(a.point / b.point_amount, 5) AS point_ratio
FROM worktables a
LEFT JOIN 
(SELECT 
    ktype,
    SUM(point) AS point_amount
 FROM worktables
 GROUP BY ktype
 ) b
 ON a.ktype = b.ktype

サブクエリではくて、OVER関数を使う方法、、、

OVER 関数を使う。(全ての point合計値の比率)

SELECT
    id, 
    wname,
    ktype,
    at_create,
    point, 
    SUM(point) OVER()                   AS point_amount,
    ROUND(point / SUM(point) OVER(), 5) AS point_ratio
FROM worktables


OVER 関数を使う。(ktype別の point合計値の比率)

SELECT
    id, 
    wname,
    ktype,
    at_create,
    point, 
    SUM(point) OVER(PARTITION BY ktype)                   AS point_amount,
    ROUND(point / SUM(point) OVER(PARTITION BY ktype), 5) AS point_ratio
FROM worktables

PARTITION BY は、複数指定することができて、
ktype 、更に at_create でグルーピングする場合は、
OVER(PARTITION BY ktype, at_create )
と記述する。