我需要帮助准备解决此问题的查询:
正在执行:从客户端选择*

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/

10-17 03:10