[英]PostgreSQL: UPDATE using aggregate function
我想更新使用聚合函數設置列ibase
的table paneldata
。
UPDATE paneldata p
SET ibase=SUM(1/i.dist)
FROM ibaselang i
WHERE p.gid=i.gid
AND i.instp<p.period
這會導致ERROR: aggregate functions are not allowed in UPDATE
CREATE TABLE public.ibaselang
(
gid integer,
dist double precision,
buildid integer,
instp smallint
)
WITH (
OIDS=FALSE
);
不幸的是我不知道如何在子查詢中實現我的WHERE
函數。
這是一個如何做到的通用示例。
UPDATE public.customer_value cv
SET total_value = sub_q.sum_val
FROM
(
SELECT SUM(order_amount) AS sum_val, o.customer_id
FROM public.orders AS o
GROUP BY o.customer_id
) AS sub_q
WHERE sub_q.customer_id = cv.customer_id;
如果你想完整地試試這個例子,你可以像這樣創建虛擬數據:
CREATE TABLE public.customer_value
(
customer_id int
, total_value numeric (10,2)
);
CREATE TABLE public.orders
(
customer_id int
, order_amount numeric(10,2)
);
INSERT INTO public.customer_value
(customer_id)
VALUES
(1)
, (2);
INSERT INTO public.orders
(customer_id, order_amount)
VALUES
(1, 10)
,(1, 10)
,(2, 7.5)
,(2, 7.5);
我不知道這有多高效,但它應該有效:
with updates as (
select
p.gid, sum (i.dist) as dist
from
paneldata p
join ibaselang i on
p.id = i.gid and
i.instp < p.period
where
i.dist != 0
group by
p.gid
)
update paneldata p
set
ibase = 1 / u.dist
from
updates u
where
p.gid = u.pid and
u.dist != 0
關於添加的其他幾個注意事項:
i.dist
有很多零,那么刪除where
子句中的零值理論上可以加快查詢速度 嘗試使用這樣的相關查詢:
UPDATE paneldata p
SET p.ibase=(select SUM(1/i.dist)
FROM ibaselang i
WHERE p.gid=i.gid
AND i.instp<p.period)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.