sql - PostgreSQL HAVING 子句

标签 sql postgresql aggregate-functions having

我昨晚在这里发帖寻求一些家庭作业的帮助。我要回答最后一个问题了。

这是我正在使用的模式的相关部分:

CREATE TABLE votesOnPoll(
  user_id int,
  poll_id int,
  option_id int, 
  voteDate date,
  CONSTRAINT votesOnPoll_pk PRIMARY KEY (user_id, poll_id),
  CONSTRAINT votesOnPoll_user_fk FOREIGN KEY (user_id) REFERENCES users(id),
  CONSTRAINT votesOnPoll_poll_fk FOREIGN KEY (poll_id,option_id) REFERENCES pollOptions(poll_id, option_id)
);

我正在尝试编写一个查询,该查询将返回票数最多的投票选项的 option_id 以及票数。这仅在民意调查 10 中。

我可以通过以下查询成功返回每个选项的投票数:

SELECT p10.oid AS option_id, MAX(p10.votecount)
FROM (SELECT option_id AS oid, COUNT(DISTINCT user_id) AS votecount
      FROM votesOnPoll
      WHERE poll_id = 10
      GROUP BY option_id) AS p10
GROUP BY p10.oid;

在这种情况下,返回以下关系:

option_id | max
----------+-----
        0 |   7
        1 |  10
        2 |  11

我想精简它,让它只有元组 (2, 11)(或任何获胜选项)。我想我可以通过添加以下 HAVING 子句来完成此操作:

HAVING COUNT(p10.votecount) >= ALL (SELECT COUNT(DISTINCT user_id)
                                    FROM votesOnPoll
                                    WHERE poll_id = 10
                                    GROUP BY option_id)

但是,这会返回一个空关系。

我已经确认内部 SELECT 语句返回了我所期望的结果——也就是说,它返回了一个具有单个属性的关系,即对特定选项的投票数。在这种情况下,该返回值是:

 count
-------
     7
    10
    11

有什么想法吗?

最佳答案

Aaaaaa 发布后大约 5 秒,我发现了错误。我没有说“HAVING COUNT(...)”,而是使用了“HAVING MAX(...)”,我得到了正确的信息。

关于sql - PostgreSQL HAVING 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3937741/

相关文章:

SQLite 的 SQL 查询日志记录?

MySQL 表值与当前日期和上一个日期的差异

arrays - jsonb vs jsonb[] 用于客户的多个地址

python sql间隔

mysql - 普通列后跟聚合函数但不在分组依据中

PostgreSQL 在单个查询中随时间推移滚动标准偏差

java - 足够安全吗?

mysql - 从字符串 "select CustName from tblCustMst "到类型 'Integer' 的转换无效

postgresql - SELECT function() AS column 和 SELECT function() column 的区别

mysql - 如何限制/剔除一些符合条件的记录? (正确的语法)