当 PostgreSQL 中特定字段的平均值为空时如何分配零(0)
How to assign zero(0) when the avg of a particular field is null in PostgreSQL
我有两个表:
Table user_ratings
id home_info_id ratings
1 1 3.5
2 2 3.5
3 1 4
4 1 5
5 1 2
6 2 1
7 2 4
Table home_info
:
id home_name
1 my_home
2 ur_home
3 his_home
如您所见,'my_home' 和 'ur_home' 有评分,但 'his_home' 尚未评分。我正在计算所有房屋的平均值,所以我只得到两个房屋的平均值,即 'my_home' 和 'ur_home',正如我所说 'his_home' 尚未评级,所以我没有得到'his_home' 在我下面的查询中。我想要所有尚未评级的房屋名称。这是我的查询:
select u.home_info_id
, avg(u.ratings)
, h.home_name
from user_ratings u
, home_info h
where h.id = u.home_info_id
group by u.home_info_id
, h.home_name;
输出是这样的:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
但我想要这样的东西:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
3 0 his_home
您可以将 COALESCE
与 LEFT JOIN
一起使用(而不是隐式 INNER JOIN
):
select h.id
, coalesce(avg(u.ratings), 0)
, h.home_name
from home_info h
left join user_review u on h.id = u.home_info_id
group by h.id
, h.home_name
当扫描整个 table 或其中的大部分时,在您加入 之前聚合 更便宜:
SELECT h.id, h.home_name
, COALESCE(u.avg_rating, 0) AS avg_rating
FROM home_info h
LEFT JOIN (
SELECT home_info_id AS id, avg(ratings) AS avg_rating
FROM user_review
GROUP BY 1
) u USING (id);
用 EXPLAIN ANALYZE
测试。
- How to make a SELECT query in Hibernate includes Subquery COUNT(*)
- Aggregate a single column in query with many columns
我有两个表:
Table user_ratings
id home_info_id ratings
1 1 3.5
2 2 3.5
3 1 4
4 1 5
5 1 2
6 2 1
7 2 4
Table home_info
:
id home_name
1 my_home
2 ur_home
3 his_home
如您所见,'my_home' 和 'ur_home' 有评分,但 'his_home' 尚未评分。我正在计算所有房屋的平均值,所以我只得到两个房屋的平均值,即 'my_home' 和 'ur_home',正如我所说 'his_home' 尚未评级,所以我没有得到'his_home' 在我下面的查询中。我想要所有尚未评级的房屋名称。这是我的查询:
select u.home_info_id
, avg(u.ratings)
, h.home_name
from user_ratings u
, home_info h
where h.id = u.home_info_id
group by u.home_info_id
, h.home_name;
输出是这样的:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
但我想要这样的东西:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
3 0 his_home
您可以将 COALESCE
与 LEFT JOIN
一起使用(而不是隐式 INNER JOIN
):
select h.id
, coalesce(avg(u.ratings), 0)
, h.home_name
from home_info h
left join user_review u on h.id = u.home_info_id
group by h.id
, h.home_name
当扫描整个 table 或其中的大部分时,在您加入 之前聚合 更便宜:
SELECT h.id, h.home_name
, COALESCE(u.avg_rating, 0) AS avg_rating
FROM home_info h
LEFT JOIN (
SELECT home_info_id AS id, avg(ratings) AS avg_rating
FROM user_review
GROUP BY 1
) u USING (id);
用 EXPLAIN ANALYZE
测试。
- How to make a SELECT query in Hibernate includes Subquery COUNT(*)
- Aggregate a single column in query with many columns