From: | Erik Wienhold <ewie(at)ewie(dot)name> |
---|---|
To: | Rafal Pietrak <rafal(at)ztk-rp(dot)eu>, pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: an difficult SQL |
Date: | 2022-11-06 14:23:19 |
Message-ID: | 251756722.142989.1667744599679@office.mailbox.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
> On 06/11/2022 13:48 CET Rafal Pietrak <rafal(at)ztk-rp(dot)eu> wrote:
>
> W dniu 5.11.2022 o 19:05, Thiemo Kellner pisze:
> >
> > You first could select the three users with the most recent entries with
> > a windowing function
> > (https://www.postgresql.org/docs/15/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS)
>
> surely I'm missing something crucial here:
> select row_number() over w,* from eventlog where row_number() over w < 5
> window w as (partition by user);
> ERROR: window functions are not allowed in WHERE
>
> So I'm unable to pick a limited number of rows within the user
> "group-window" ranges.
>
> Without that, I cannot proceed.
>
> Any suggestions?
Windows functions are only permitted in SELECT and ORDER BY because they are
executed after WHERE, GROUP BY, and HAVING[1].
You need a derived table to filter on row_number:
with
ranked as (
select *, row_number() over w
from eventlog
window w as (partition by user)
)
select *
from ranked
where row_number < 5;
[1] https://www.postgresql.org/docs/15/tutorial-window.html
--
Erik
From | Date | Subject | |
---|---|---|---|
Next Message | Stefan Froehlich | 2022-11-06 14:35:44 | Re: server process (PID 2964738) was terminated by signal 11: Segmentation fault |
Previous Message | Tom Lane | 2022-11-06 14:13:08 | Re: server process (PID 2964738) was terminated by signal 11: Segmentation fault |