我目前在 Microsoft SQL Server 中有以下代码来获取连续两天查看的用户。
WITH uservideoviewvideo (date, user_id) AS (
SELECT DISTINCT date, user_id
FROM clickstream_videos
WHERE event_name ='video_play'
and user_id IS NOT NULL
)
SELECT currentday.date AS date,
COUNT(currentday.user_id) AS users_view_videos,
COUNT(nextday.user_id) AS users_view_next_day
FROM userviewvideo currentday
LEFT JOIN userviewvideo nextday
ON currentday.user_id = nextday.user_id AND DATEADD(DAY, 1,
currentday.date) = nextday.date
GROUP BY currentday.date
我正在尝试让 DATEADD 函数在 PostgreSQL 中工作,但我一直无法弄清楚如何让它工作。有什么建议吗?
我不认为 PostgreSQL 真的有 DATEADD 函数。相反,只需这样做:
+ INTERVAL '1 day'
SQL 服务器:
在当前日期 2012 年 11 月 21 日基础上添加 1 天
#2012-11-22 17:22:01.423SELECT DATEADD(day, 1, GETDATE());
PostgreSQL:
在当前日期 2012 年 11 月 21 日基础上添加 1 天
#2012-11-22 17:22:01SELECT CURRENT_DATE + INTERVAL '1 day';
#2012-11-22 17:22:01SELECT CURRENT_DATE + 1;
http://www.sqlines.com/postgresql/how-to/dateadd
编辑:
如果您使用动态时间长度来创建字符串,然后将其转换为间隔,例如:
,这可能会很有用+ (col_days || ' days')::interval
您可以使用
date + 1
执行与 dateadd()
相同的操作,但我不认为您的查询会执行您想要执行的操作。
您应该使用窗口函数:
with plays as (
select distinct date, user_id
from clickstream_videos
where event_name = 'video_play'
and user_id is not null
), nextdaywatch as (
select date, user_id,
case
when lead(date) over (partition by user_id
order by date) = date + 1 then 1
else 0
end as user_view_next_day
from plays
)
select date,
count(*) as users_view_videos,
sum(user_view_next_day) as users_view_next_day
from nextdaywatch
group by date
order by date;
DATE_ADD()
现已存在。
在您的示例中,您可以使用
DATE_ADD(currentday.date, '1 day')
来自文档:
→ 带时区的时间戳date_add ( timestamp with time zone, interval [, text ] )
向带有时区的时间戳添加一个间隔,根据第三个参数指定的时区或当前的 TimeZone 设置(如果省略)计算一天中的时间和夏令时调整。带有两个参数的形式相当于带有时区的时间戳 + 间隔运算符。
→ 2021-10-31 23:00:00+00date_add('2021-10-31 00:00:00+02'::timestamptz, '1 day'::interval, 'Europe/Warsaw')