我有一个复杂的问题,乍一看似乎微不足道:
我将用于查询的表是登录表(在Redshift中托管),它有一个时间戳,其中包含logintime和usertoken作为用户标识符。
每当我想在一天内回答这个问题时,查询就很简单明了:
select count (distinct usertoken)
from logins
where datediff('d',logintime,getdate()) <= 90
问题变得复杂,因为我希望在每个给定日期的数字表中都有这个。
07/07 100k
07/06 98k
07/05 99k
07/04 101k
(...)
窗口函数对我没有帮助,因为我需要计算不同,这在窗口函数中是不可能的。
据我所知,没有办法迭代SQL查询。
我应该怎么做?
答案 0 :(得分:0)
琐碎的方式非常昂贵:
select days.d, count(distinct l.userid)
from (select distinct date_trunc('day', logintime) as d
from logins l
) days left join
(select distinct userid, date_trunc('day', logintime) as d
from logins
) l
on datediff('d', l.d, days.d) between 0 and 89
group by days.d
order by days.d;
答案 1 :(得分:0)
也许我错过了一些东西,但据我所知,应该这样做:
- 在SQL Server中
PostGreSQL中的select cast(logintime As Date),从登录计数(distinct usertoken) 其中datediff(D,logintime,getdate())&lt; = 90分组依据 cast(logintime As Date)
将强制转换(logintime As Date)更改为trunc_Date(Day,logintime) 和datediff(D,logintime,getdate())到datediff('d',logintime,getdate())
答案 2 :(得分:0)
我假设如果有一天没有用户登录,请不要介意不在列表中显示。
首先,我们会得到一组我们关心的所有日子并称之为#34;天&#34;。
with days as (
select date_trunc('day', date) as day from logins
where date > now() - '90 days'::interval
group by day
)
然后我们加入登录日期。
select day, count(distinct userid)
from days
join logins on date_trunc('day', logins.date) = days.day
group by day
order by day