gpt4 book ai didi

sql - 如何计算 PostgreSQL 中条件出现的次数?

转载 作者:行者123 更新时间:2023-12-02 18:12:30 25 4
gpt4 key购买 nike

我在 PostgreSQL 工作。假设我有这个 Person 表:

| id |          time         | name  |    type     |
----------------------------------------------------
| 1 | 2022-04-25 07:49:58.0 | Brian | Rejection 1 |
| 2 | 2022-04-25 07:49:58.0 | Brian | Rejection 2 |
| 3 | 2022-04-27 13:05:51.0 | Fredd | Rejection 1 |
| 4 | 2022-05-01 02:13:44.0 | Janet | Rejection 1 |
| 5 | 2022-05-01 03:45:06.0 | Janet | Rejection 2 |
| 6 | 2022-05-01 08:01:34.0 | Peter | Approval |
| 7 | 2022-05-01 12:12:53.0 | Frank | Rejection 2 |
| 8 | 2022-05-02 01:26:38.0 | Frank | Approval |

注意:我们有 2 种拒绝类型 Rejection 1Rejection 2

我想进行一个查询,计算每个名称的拒绝数量和批准数量。但是,如果同时有 2 次拒绝,对于相同的名称,如示例中的前两行,则应仅算作一次。

让我补充一点,同一个名字可以同时存在一种拒绝类型,但同一个名字不可能同时存在两种相同类型的拒绝。

这就是我期望它返回的结果:

| name  | approvals | rejections |
----------------------------------
| Brian | 0 | 1 |
| Fredd | 0 | 1 |
| Janet | 0 | 2 |
| Peter | 1 | 0 |
| Frank | 1 | 1 |

我能得到的最接近的结果如下:

SELECT 
name,
COALESCE(SUM(CASE WHEN log_type = 'Approval' THEN 1 ELSE 0 END), 0) approvals,
COALESCE(SUM(CASE WHEN log_type = 'Rejection 1' OR log_type = 'Rejection 2' THEN 1 ELSE 0 END), 0) rejections
FROM
person
GROUP BY
name

这样做的问题是,它会将具有相同时间和名称的两次拒绝计数为 2,而不是 1。

最佳答案

您可以使用DISTINCT里面COUNT()计算不同的 time如果 log_type'Rejection X' :

SELECT name,
COUNT(CASE WHEN log_type = 'Approval' THEN 1 END) approvals,
COUNT(DISTINCT CASE WHEN log_type IN ('Rejection 1', 'Rejection 2') THEN time END) rejections
FROM person
GROUP BY name;

请参阅demo .

关于sql - 如何计算 PostgreSQL 中条件出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72084749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com