gpt4 book ai didi

postgresql - 在 Redshift/Postgres 中,如何计算满足条件的行数?

转载 作者:行者123 更新时间:2023-11-29 11:06:17 25 4
gpt4 key购买 nike

我正在尝试编写一个只计算满足条件的行的查询。

比如在MySQL中我会这样写:

SELECT
COUNT(IF(grade < 70), 1, NULL)
FROM
grades
ORDER BY
id DESC;

但是,当我尝试在 Redshift 上执行此操作时,它会返回以下错误:

错误:函数 if(boolean, integer, "unknown") 不存在

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

我检查了条件语句的文档,我找到了

NULLIF(value1, value2)

但它只比较 value1 和 value2,如果这些值相等,则返回 null。

我找不到一个简单的 IF 语句,乍一看我找不到一种方法来做我想做的事情。

我尝试使用 CASE 表达式,但没有得到我想要的结果:

SELECT 
CASE
WHEN grade < 70 THEN COUNT(rank)
ELSE COUNT(rank)
END
FROM
grades

这是我想要计数的方式:

  • 不及格(等级 < 70)

  • 平均(70 <= 成绩 < 80)

  • 好(80 <= 等级 < 90)

  • 优秀(90 <= 等级 <= 100)

这就是我希望看到的结果:

+========+=========+======+===========+
| failed | average | good | excellent |
+========+=========+======+===========+
| 4 | 2 | 1 | 4 |
+========+=========+======+===========+

但我得到这个:

+========+=========+======+===========+
| failed | average | good | excellent |
+========+=========+======+===========+
| 11 | 11 | 11 | 11 |
+========+=========+======+===========+

我希望有人能给我指出正确的方向!

如果这有帮助,这里有一些示例信息

CREATE TABLE grades(
grade integer DEFAULT 0,
);

INSERT INTO grades(grade) VALUES(69, 50, 55, 60, 75, 70, 87, 100, 100, 98, 94);

最佳答案

首先,您在这里遇到的问题是您所说的是“如果成绩小于 70,则此 case 表达式的值为 count(rank)。否则,此表达式的值为 count (秩)。”因此,无论哪种情况,您总是获得相同的值(value)。

SELECT 
CASE
WHEN grade < 70 THEN COUNT(rank)
ELSE COUNT(rank)
END
FROM
grades

count() 只计算非 null 值,因此通常您将看到的模式是这样的:

SELECT 
count(CASE WHEN grade < 70 THEN 1 END) as grade_less_than_70,
count(CASE WHEN grade >= 70 and grade < 80 THEN 1 END) as grade_between_70_and_80
FROM
grades

这样的话,case 表达式只会在测试表达式为真时计算为 1,否则将为 null。然后 count() 将只计算非空实例,即当测试表达式为真时,这应该会给你你需要的。

编辑:作为旁注,请注意这与您最初使用 count(if(test, true-value, false-value)) 编写的方式完全相同,只是重新- 写成 count(case when test then true-value end)(null 是 false-value 的代表,因为 else 没有提供给案例)。

编辑:postgres 9.4 在最初的交流后几个月发布。那个版本引入了聚合过滤器,它可以让这样的场景看起来更漂亮、更清晰。这个答案仍然偶尔会得到一些赞成票,所以如果你在这里偶然发现并使用更新的 postgres(即 9.4+),你可能需要考虑这个等效版本:

SELECT
count(*) filter (where grade < 70) as grade_less_than_70,
count(*) filter (where grade >= 70 and grade < 80) as grade_between_70_and_80
FROM
grades

关于postgresql - 在 Redshift/Postgres 中,如何计算满足条件的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21288458/

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