根据聚合查询中的基础行返回列

时间:2013-05-28 21:48:56

标签: sql postgresql aggregate-functions

考虑下表:

 comment_id | vote | user_id 
------------+------+---------
      79507 |    1 |  351501
      79507 |    2 |  533594
      79544 |    1 |  648703
      79544 |    1 |  533594
      79544 |    2 |  790789
      79545 |    1 |  351501

此聚合查询返回每votecomment_id列的总和:

SELECT comment_id, SUM(vote_up) 
FROM votes 
GROUP BY comment_id 
ORDER BY comment_id;

 comment_id | sum 
------------+-----
      79507 |   3
      79544 |   4
      79545 |   1

但是,如果基础分组行的任何满足条件,我希望返回一个额外的列。在这种情况下,当且仅当任何聚合行具有给定的user_id(在此示例中为user_id 351501)时,voted列应为true:

 comment_id | sum | voted
------------+-----+-------
      79507 |   3 |     t
      79544 |   4 |     f
      79545 |   1 |     t

我看到了一个可能的解决方案,通过将表连接到自身,但这似乎是一个黑客,似乎非常低效。我遇到了窗口函数,不确定它们是否适用于这个问题。

1 个答案:

答案 0 :(得分:5)

使用聚合函数bool_or()

SELECT comment_id, SUM(vote_up) AS sume_vote
      ,bool_or(user_id = 351501) AS voted
FROM   votes
GROUP  BY 1
ORDER  BY 1;