【问题标题】:Percentage based on foreign_key基于foreign_key的百分比
【发布时间】:2019-06-03 08:41:19
【问题描述】:

我有一个名为 animals 的表,其中包含以下列:

id: INT
state: VARCHAR

还有一个名为 house 的表格,其中包含以下列:

id: INT
animal_id: INT
color: VARCHAR

我正在尝试获取动物的百分比(哪个状态为“活着”)及其 ID 在给定集合内,至少有一个房子(颜色为“红色”)。如果一只动物有不止一个红色的房子,没关系,应该算一次。

我知道如何获得符合这些条件的动物数量:

SELECT COUNT(*)
FROM animals
WHERE state = 'living'
AND id IN (10,11,12)

而且我知道如何获得具有这些条件的房屋:

SELECT COUNT(*)
FROM houses
WHERE color = 'red'

我不确定如何结合这两个查询来获得动物的百分比。

样本数据:

animals (id, state)

1, 'living'
2, 'dead'
3, 'living'
4, 'living'
5, 'dead'
6, 'living'


houses (id, animal_id, color)

1, 1, 'red'
2, 2, 'red'
3, 1, 'blue'
4, 6, 'red'
5, 4, 'red'
6, 1, 'red'  

我们希望将动物范围缩小到 ID 为 1、2、3 和 5 的动物。

因此,由于 id 为 2 和 5 的动物已经死亡,因此不应将它们算作分母的一部分。现在,这给我们留下了动物 1 和 3,但只有 id 为 1 的动物有至少一个红房子(注意它有两个,但我们不在乎),这意味着百分比是:

(1 只动物至少有一个阅读房屋)/(2 只活着的动物)= 50%

【问题讨论】:

    标签: sql postgresql percentage


    【解决方案1】:

    您可以使用LEFT JOIN 来组合表格。那么AVG()就可以得到你想要的比例了:

    SELECT AVG( (h.color = 'red')::int ) as ratio_red
    FROM animals a LEFT JOIN
         houses h
         ON a.id = h.animal_id
    WHERE a.state = 'living'
          a.id IN (10, 11, 12);
    

    对于修改后的计算,可以使用:

    SELECT COUNT(DISTINCT CASE WHEN h.color = 'red' THEN h.animal_id END) / COUNT(DISTINCT a.id) as ratio_red
    FROM animals a LEFT JOIN
         houses h
         ON a.id = h.animal_id
    WHERE a.state = 'living'
          a.id IN (10, 11, 12);
    

    【讨论】:

    • 戈登,如果一只动物有不止一个红房子,这不会算两次吗?我只想让每个动物/红房子组合计算一次。
    • @HommerSmith 。 . .有这种可能吗?
    • 是的,我更新了我的样本数据以表示动物 1 有两个红房子,但我们并不关心这一点。我们只想知道至少拥有红房子的活体动物的百分比。抱歉,我没有将这种情况放在示例数据中。
    【解决方案2】:

    选择animal_id,color ,living from house t1 Inner join(select Id,count(*) as living from animal group by id) t2 在 t1.animalid=t2.id where color='red'

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 2020-12-09
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2011-04-08
      • 2021-09-10
      • 2018-08-15
      • 2012-08-11
      相关资源
      最近更新 更多