SQL计算行数

标签 sql postgresql count

我有以下内容:

SELECT nominees.personname, awards.name as awards, nominees.filmname 
FROM nominees, awards WHERE nominees.aid = awards.aid and nominees.personname is not 
NULL GROUP BY nominees.personname, awards.name, nominees.filmname 
ORDER BY nominees.personname;

这会产生下表:

"personname"    "awards"        "filmname"

"Ang Lee"       "director"      "Life of Pi"
"Anglelina J."  "actress"       "The Tourist"
"Ann Dowd"   "supporting actress"   "Compliance"
"Anne Hathaway" "actress"      "Love and Other Drugs"
"Anne Hathaway" "supporting actress"  "Les Misrables"
"Annette Bening"    "actress"   "The Kids Are All Right"
"Another Year"  "screenplay"    "Mike Leigh"
"A.R. Rahman"     "score"       "127 Hours"
"AR Rahman"       "score"       "127 Hours"
"Barbara Hershey"   "supporting actress"    "Black Swan"
"Ben Affleck"   "actor"         "Argo"
"Ben Affleck"   "director"      "Argo"

我正在尝试获取仅包含因同一部电影获得两个不同奖项提名的人的集合。在这个特定的表中,只有“Ben Affleck”。

结果应该是

    "personname"    "awards"        "filmname"

    "Ben Affleck"   "actor"         "Argo"
    "Ben Affleck"   "director"      "Argo"

但我似乎无法理解,我已尝试使用 HAVING 和某种计数方法,但无法使其正常工作。感谢您的帮助。

最佳答案

这是一个简单的聚合查询。让这个人做:

select personname, filmname
from (SELECT nominees.personname, awards.name as awards, nominees.filmname 
      FROM nominees, awards WHERE nominees.aid = awards.aid and nominees.personname is not NULL
      GROUP BY nominees.personname, awards.name, nominees.filmname 
     ) t
 group by personname, filmname
 having count(*) > 1

您可以根据原始数据来表达这一点,并在一行中获取列表:

SELECT nominees.personname, nominees.filmname, array_agg(awards.name) as listOfaward
FROM nominees join
     awards
     on nominees.aid = awards.aid
where nominees.personname is not NULL
GROUP BY nominees.personname, nominees.filmname 
having COUNT(distinct  awards.name) > 1

要为每个奖项获得单独的行,您可以连接回原始数据:

select personname, filmname, a.name
from (SELECT nominees.personname, nominees.filmname, array_agg(awards.name) as listOfaward
      FROM nominees join
           awards
           on nominees.aid = awards.aid
      where nominees.personname is not NULL
      GROUP BY nominees.personname, nominees.filmname 
      having COUNT(distinct  awards.name) > 1
     ) l join
     nominees n
     on n.personname = l.personname and n.filmname = l.filmname join
     awards a
     on n.aid = a.aid

关于SQL计算行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233611/

相关文章:

python - 如何从sqlalchemy中的查询中获取列表

MySQL 选择列仅包含集合中的值的行

database - Rails database.yml 中的超时单位是什么?

r - 计算 R 中分类变量的出现次数

mysql - 未找到特定记录时插入

mysql - 选择查询从间隔表中获取值

postgresql - 当某些列是时间戳时,如何插入值?

javascript - 使用 Node pg 选择当前值后如何增加 postgres 表列?

mongodb - 在 MongoDB 的 pymongo 中,我该如何做 count()?

python - Pandas 计算分组数据帧中连续相等值的长度