【问题标题】:Counting totals and partials计算总数和部分
【发布时间】:2014-06-06 21:53:58
【问题描述】:

我在 PostgreSQL 引擎驱动的数据库中有一个表 answers,其中有一个与问题相关联的数字。我需要数一数有多少个数字,按问题分组有多少个低于 6。

我想要的是这样的:

SELECT question, count(*) AS Qanswers, count_below_6(*) AS Qanswers_below_6
FROM answers
GROUP BY question;

      question         | Qanswers | Qanswers_below_6
-----------------------+----------+------------------
How do you feel?       |  1234    |      53
Was clear the webinar? |  8444    |      20
How much that hurt?    |  3666    |     142

目前我正在做

SELECT question, count(*) AS Qanswers
FROM answers
GROUP BY question;

然后

SELECT question, count(*) AS Qanswers
FROM answers
WHERE value < 6
GROUP BY question;

之后我手动合并这两个结果。
我可以用一个句子来给出我需要的结果吗?

【问题讨论】:

  • postgresql engine powered database?这是否意味着您有一个不是 PostgreSQL 的数据库,但正在使用它的引擎?我很想看看所说的数据库。是在 GitHub 上吗?

标签: sql postgresql count aggregate-functions


【解决方案1】:
SELECT question
      ,count(*) AS answers
      ,count(value < 6 OR NULL) AS under_6
FROM   answers
GROUP  BY question;

诀窍在于count(expression) 只计算非空值(而count(*) 计算所有 行)。以下是我们为什么在正确的地方得到 NULL 的详细解释:
Compute percents from SUM() in the same SELECT sql query

有许多等效的技术可以实现这一点。与基准的详细比较:
For absolute performance, is SUM faster or COUNT?

【讨论】:

  • 在性能分析中包含使用范围表可能会很有趣——例如,使用SELECT question, COUNT(*) AS answers, COUNT(low) AS under_6 FROM Answers LEFT JOIN (VALUES (6)) Lim(low) ON Answers.value &lt; Lim.low GROUP BY question。当然,使用CASE 和相关的东西更容易处理更复杂的条件......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多