【问题标题】:How to find columns that only have one value - Postgresql如何查找只有一个值的列 - Postgresql
【发布时间】:2020-03-11 18:50:37
【问题描述】:

我有 2 张桌子,person(email, first_name, last_name, postcode, place_name)location(postcode, place_name)。我试图找到住在只有一个人居住的地方的人。我尝试使用 SELECT COUNT() 但失败了,因为我不知道在这种情况下应该计算什么。

SELECT DISTINCT email,
                first_name,
                last_name
FROM person
INNER JOIN location USING(postcode,
                          place_name)
WHERE 1 <=
    (SELECT COUNT(?))

【问题讨论】:

  • 加入“位置”似乎没有任何意义,因为它不会带来“人”中没有的信息。

标签: sql postgresql select count aggregate-functions


【解决方案1】:

聚合函数总是使用having

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_value)的更多信息,请查看this tutorial

【讨论】:

  • 我得到这个错误:语法错误在“(”第4行或附近:count(*)。你能解释一下“first_value”和OVER的功能吗?
  • @arthionne 抱歉,忘记句号了;> first_value 常用窗口函数:postgresqltutorial.com/postgresql-first_value-function
  • 您能否编辑您的答案,以便我可以接受它作为答案。并感谢您的解释。
  • @arthionne 已添加,如果有帮助,请考虑投票
  • 我才发现有些地方同名但邮政编码不同,例如 20814 Bethesda 和 20815 Bethesda。我是否需要更改任何内容才能将地点定义为名称和邮政编码的组合?
【解决方案2】:

我会这样做。我觉得它简单明了。

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。我认为这可能是最自然的方式。

【讨论】:

    【解决方案3】:

    感谢这里的人的帮助,我找到了这个答案:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多