Sql 如何强制红移中的零值?
如果这是我的问题:Sql 如何强制红移中的零值?,sql,amazon-redshift,Sql,Amazon Redshift,如果这是我的问题: select (min(timestamp))::date as date, (count(distinct(user_id)) as user_id_count (row_number() over (order by signup_day desc)-1) as days_since from data.table where timestamp >= current_date - 3 group by timestamp order by t
select
(min(timestamp))::date as date,
(count(distinct(user_id)) as user_id_count
(row_number() over (order by signup_day desc)-1) as days_since
from
data.table
where
timestamp >= current_date - 3
group by
timestamp
order by
timestamp asc;
这是我的结果
date | user_id_count | days_since
------------+-----------------+-------------
2018-01-22 | 3 | 1
2018-01-23 | 5 | 0
如何使其显示在表中(其中用户ID计数为0?):
您需要生成日期。在Postgres中,
generate_series()
select g.ts as dte,
count(distinct t.user_id) as user_id_count
row_number() over (order by signup_day desc) - 1) as days_since
from generate_series(current_date::timestamp - interval '3 day', current_date::timestamp, interval '1 day') g(ts) left join
data.table t
on t.timestamp::date = g.ts
group by t.ts
order by t.ts;
您必须创建一个带有日期的“日历”表,并按如下方式加入聚合结果:
with
aggregated_result as (
select ...
)
select
t1.date
,coalesce(t2.user_id_count,0) as user_id_count
,coalesce(t2. days_since,0) as days_since
from calendar t1
left join aggregated_result t2
using (date)
有关创建日历表的详细信息:不确定这是否可行,是否尝试了合并(计数(…),0)作为用户_id_count
?如果您使用整数形式,AFAIK会处理红移,这样您就可以加入一个生成天数的
生成系列,并将这些天数添加到当前日期,以获得您所关注的日期。这听起来很完美!我的数据库不断返回“函数generate_series(时间戳无时区,时间戳无时区,间隔)不存在”@user2928789。它确实存在(),但您也可以单独列出这些值。那么我是否正确地理解generate_series在红移上不起作用?@user2928789。你说得对。问题被标记为“postgres”,标题明确提到“postgres”。对不起,我以为Redshift运行的是postgres 8.0
with
aggregated_result as (
select ...
)
select
t1.date
,coalesce(t2.user_id_count,0) as user_id_count
,coalesce(t2. days_since,0) as days_since
from calendar t1
left join aggregated_result t2
using (date)