From: | jian he <jian(dot)universality(at)gmail(dot)com> |
---|---|
To: | pgsql-general list <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | first order by then partition by x < a fixed value. |
Date: | 2022-07-14 07:53:55 |
Message-ID: | CACJufxED4OyS3+o=5=NSmN5YG_BPNHzdDSj4TR0SjmZJ0e-ETg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
This question (https://stackoverflow.com/q/72975669/15603477) is fun.
DB fiddle link:
https://dbfiddle.uk/?rdbms=postgres_14&fiddle=36d685ad463831877ae70361be2cfa3b
account
size id name 100 1 John 200 2 Mary 300 3
Jane 400 4 Anne100 5 Mike 600 6 Joanne
Then expected output: account group size id name 1 100
1 John 1 200 2 Mary 1 300 3 Jane 2
400 4 Anne2 100 5 Mike 3 600 6 Joanne
Idea is fixed order by id then cumulative sum. if <=600 then grouped
together using the same row_number.
But I imagine this kind question has been solved many times.
Current posted solution uses a recursive query, which is really hard for
me.
Is there any simple or more intuitive way to solve this kind of problem?
I can write some customized aggregate function to aggregate stops at 600.
I can get the following result, So what's the next step?
+------+----+--------+---------------+-----------------+
| size | id | name | capped_at_600 | large_or_eq_600 |
+------+----+--------+---------------+-----------------+
| 100 | 1 | John | 100 | f |
| 200 | 2 | Mary | 300 | f |
| 300 | 3 | Jane | 600 | t |
| 400 | 4 | Anne | 400 | f |
| 100 | 5 | Mike | 500 | f |
| 600 | 6 | Joanne | 1100 | t |
+------+----+--------+---------------+-----------------+
--
I recommend David Deutsch's <<The Beginning of Infinity>>
Jian
From | Date | Subject | |
---|---|---|---|
Next Message | Frank Streitzig | 2022-07-14 09:43:32 | Re: first order by then partition by x < a fixed value. |
Previous Message | David G. Johnston | 2022-07-14 05:57:19 | Re: Seems to be impossible to set a NULL search_path |