如何查找只有一个值的列-Postgresql
我有两个表,如何查找只有一个值的列-Postgresql,sql,postgresql,select,count,aggregate-functions,Sql,Postgresql,Select,Count,Aggregate Functions,我有两个表,person(电子邮件、名字、姓氏、邮政编码、地名)和位置(邮政编码、地名)。我试图找到那些住在只有一个人居住的地方的人。我尝试使用SELECTCOUNT(),但失败了,因为在这种情况下我不知道该计数什么 SELECT DISTINCT email, first_name, last_name FROM person INNER JOIN location USING(postcode,
person(电子邮件、名字、姓氏、邮政编码、地名)
和位置(邮政编码、地名)
。我试图找到那些住在只有一个人居住的地方的人。我尝试使用SELECTCOUNT()
,但失败了,因为在这种情况下我不知道该计数什么
SELECT DISTINCT email,
first_name,
last_name
FROM person
INNER JOIN location USING(postcode,
place_name)
WHERE 1 <=
(SELECT COUNT(?))
选择不同的电子邮件,
名字,
姓
从个人
内部连接位置使用(邮政编码,
地点(姓名)
其中1聚合函数总是与具有的一起使用:
SELECT DISTINCT first_value(email) over (partition by place_name),
first_value(first_name) over (partition by place_name),
first_value(last_name) over (partition by place_name),
count(*)
FROM person
INNER JOIN location USING(postcode,
place_name)
GROUP BY place_name
HAVING count(*) = 1
有关窗口功能的更多信息(如first\u value
)请查看。多亏了这里的人的帮助,我找到了以下答案:
SELECT first_name,
last_name,
email
FROM person
WHERE postcode IN
(SELECT postcode
FROM person
GROUP BY postcode,
place_name
HAVING COUNT(place_name)=1
ORDER BY postcode)
AND place_name IN
(SELECT place_name
FROM person
GROUP BY postcode,
place_name
HAVING COUNT(postcode)=1
ORDER BY place_name)
我会这样做。我觉得它简单明了
select p1.* from
person p1
join
(
select p.postcode, p.place_name, count(*) cnt from
person p
group by p.postcode, p.place_name
) t on p1.postcode = t.postcode and p1.place_name = t.place_name and t.cnt = 1
它是如何工作的?
在内部查询(别名为t
)中,我们只需计算每个位置的居住人数。
然后我们将其结果(t
)与表person
(别名为p1
)联接,在联接中我们需要t.cnt=1
。我认为这可能是最自然的方式 我得到这个错误:语法错误在或接近“(“第4行:count(*)。你能解释一下“first_value”的功能吗“阿瑟尼恩,对不起,忘记了句号;>代码>第一个值< /代码>通常与窗口函数一起使用:你能编辑你的答案吗?这样我就可以接受它了。谢谢你的解释。”阿瑟尼补充说,“如果有帮助的话,我就可以意识到,有些地方有相同的名字,但是有不同的邮政编码。”例如20814贝塞斯达和20815贝塞斯达。我是否需要更改任何东西来将一个地方定义为名称和邮政编码的组合?加入“位置”似乎没有任何意义,因为它不会带来“个人”中没有的信息。