为缺少的列值 Postgres 插入零值行

Insert zero value rows for missing column value Postgres

我有这个 table (elev_table) :

 country      | cat |    elev
--------------+-----+----------
 USA          |   0 |    41.46
 USA          |   1 |   878.90
 USA          |   2 |    78.01    
 CAN          |   0 |    46.00
 CAN          |   1 |    78.92
 CAN          |   2 |    78.01
 CAN          |   4 |   667.77
 CAN          |   5 |    10.80

如何创建查询以 return 相同 table,并填充缺失的 cat 值? cat 列的值必须从(-1 到 5),但并非每个国家/地区值都包含每个 cat 值。

基本上,对于我 table 中的每个国家/地区,我需要为每只猫值 -1 到 5 的海拔值行.....

例如,我希望结果 table 看起来像:

 country      | cat |    elev
--------------+-----+----------
 USA          |  -1 |        0
 USA          |   0 |    41.46
 USA          |   1 |   878.90
 USA          |   2 |    78.01
 USA          |   3 |        0
 USA          |   4 |        0
 USA          |   5 |        0  
 CAN          |  -1 |        0 
 CAN          |   0 |    46.00
 CAN          |   1 |    78.92
 CAN          |   2 |    78.01
 CAN          |   3 |        0
 CAN          |   4 |   667.77
 CAN          |   5 |    10.80

我认为 0 是一个很好的表示,但也许 NULL 会更好?

我尝试了以下查询,但这并没有为每个国家/地区创建缺失的行值...我知道我遗漏了一些东西,但似乎无法弄清楚是什么!!!

with cat_series as(
  select generate_series(-1,5) as fullcat
)

select fullcat, coalesce(sum(t.elev),0), t.country
from cat_series
  left join elev_table t on cat_series.fullcat=t.cat
group by fullcat, t.country
order by fullcat, t.country;

对 postgres 还是很陌生,sql。任何帮助或指点将不胜感激!

您可以使用 cross join 后接 left join:

select c.country, g.cat, coalesce(sum(t.elev), 0)
from (select distinct country from elev_table) c cross join
     generate_series(-1, 5) as g(cat) left join
     elev_table et
     on et.country = c.country and et.cat = g.cat
group by c.country, g.cat;

我在查询中留下了 group by,虽然根据样本数据,这就足够了:

select c.country, g.cat, coalesce(t.elev, 0)
from (select distinct country from elev_table) c cross join
     generate_series(-1, 5) as g(cat) left join
     elev_table et
     on et.country = c.country and et.cat = g.cat;

如果您更喜欢 NULL 而不是 0,您可以删除 coalesce()