我需要帮助准备解决此问题的查询:
正在执行:从客户端选择*
id | client_name | client_type | reg_date
11 | Abdul | 5 | 2019-03-02
44 | Miquel | 2 | 2019-09-11
12 | Alex | 5 | 2019-09-10
18 | Sam | 3 | 2019-09-02
62 | Julio | 2 | 2019-06-02
65 | Luis | 3 | 2019-02-12
94 | Manu | 3 | 2019-09-08
72 | Robert | 2 | 2019-09-07
29 | Lisa | 1 | 2019-09-02
12 | Alex | 4 | 2019-09-10
22 | Pedro | 3 | 2019-09-10
24 | Mary | 4 | 2019-09-11
24 | MariLuz | 5 | 2019-09-01
29 | Lisa | 5 | 2019-03-02
02 | Jorge | 3 | 2019-09-01
18 | Sam | 1 | 2019-09-03
88 | Omar | 2 | 2019-02-12
32 | Jhon | 3 | 2019-01-23
98 | Yona | 4 | 2019-09-11
97 | Marisa | 2 | 2019-09-05
96 | Juan | 5 | 2019-03-02
95 | Carmen | 3 | 2019-09-01
94 | Kike | 1 | 2019-09-03
85 | Mario | 2 | 2019-02-12
87 | Raul | 5 | 2019-09-03
75 | Martina | 5 | 2019-09-01
73 | Lara | 5 | 2019-09-09
我的问题是:
如何筛选此结果,以仅查看具有类型5的前4个客户端、具有类型3的前3个客户端和具有类型2且在实际月份插入的前2个客户端(09)
所以结果必须包含:
id | client_name | client_type | reg_date
12 | Alex | 5 | 2019-09-10
24 | MariLuz | 5 | 2019-09-01
87 | Raul | 5 | 2019-09-03
75 | Martina | 5 | 2019-09-01
18 | Sam | 3 | 2019-09-02
94 | Manu | 3 | 2019-09-08
22 | Pedro | 3 | 2019-09-10
44 | Miquel | 2 | 2019-09-11
72 | Robert | 2 | 2019-09-07
有人能给我个建议吗?
当做
最佳答案
尝试此查询:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY client_type ORDER BY reg_date) rn
FROM clients
EXTRACT(MONTH FROM reg_date) = 9 AND
client_type IN (2, 3, 5)
)
SELECT id, client_name, client_type, reg_date
FROM cte
WHERE
(client_type = 2 AND rn <= 2) OR
(client_type = 3 AND rn <= 3) OR
(client_type = 4 AND rn <= 4)
ORDER BY
client_type DESC;
如果您只需要2019年的记录,我们可以稍微修改上面的查询。
关于postgresql - 使用postgres按类型和日期过滤一些记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57890061/