为缺少的列值 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()
。
我有这个 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()
。