Re: aggregate functions are not allowed in UPDATE - Mailing list pgsql-general

From David G. Johnston
Subject Re: aggregate functions are not allowed in UPDATE
Date
Msg-id CAKFQuwYRdGHT4RnqJ5AMLt3QxY+noo=rANNwdHn83q18njdrDw@mail.gmail.com
Whole thread Raw
In response to Re: aggregate functions are not allowed in UPDATE  (Alexander Farber <alexander.farber@gmail.com>)
Responses Re: aggregate functions are not allowed in UPDATE  (Alexander Farber <alexander.farber@gmail.com>)
List pgsql-general
On Tue, Jan 15, 2019 at 12:42 PM Alexander Farber
<alexander.farber@gmail.com> wrote:
>
> Last question please - how to run the query for all users?
>
> I know I could use the FOR-loop from PL/PgSQL, but is there also a pure SQL way?
>
> How to refer to the outside "uid" from inside the CTE in the query below?
>
> WITH diffs AS (
>   SELECT
>       gid,
>       uid,
>       played - LAG(played) OVER(PARTITION BY gid ORDER BY played) AS diff
>   FROM moves
>   WHERE uid = how_to_refer_to_the_outside_uid
> )
> UPDATE users SET avg_time =
> (
>   SELECT
>     AVG(diff)
>   FROM diffs
>  GROUP BY uid
> )
> WHERE uid IN (SELECT uid FROM users);

UPDATE users
SET avg_time = diffs.average_time_for_the_grouped_by_user
FROM diffs
WHERE users.uid = diffs.uid --< the missing "where" I commented about earlier

But you need to construct the "diffs" CTE/subquery so that it Group[s] By uid

David J.


pgsql-general by date:

Previous
From: Rob Sargent
Date:
Subject: Re: Can anyone please provide me list of customers using postgreSQL
Next
From: "David G. Johnston"
Date:
Subject: Re: Can anyone please provide me list of customers using postgreSQL