[英]LIMIT based on COUNT of DISTINCT `foreign_key` so far
[英]Percentage based on foreign_key
我有一個名為animals
的表,它具有以下列:
id: INT
state: VARCHAR
另一個名為房屋的表具有以下列:
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%
您可以使用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);
選擇animal_id,color ,living from house t1 Inner join(select Id,count(*) as living from animal group by id) t2 On t1.animalid=t2.id where color='red'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.