如何运行';对于';在SQL中循环以获得一组结果,而不强制转换函数?
我的数据库中有表如何运行';对于';在SQL中循环以获得一组结果,而不强制转换函数?,sql,postgresql,Sql,Postgresql,我的数据库中有表users,我需要获取给定日期该表中过去90天的用户数-这是为了跟踪新用户在系统中注册的速率 在这一点上,我需要得到每天桌子的大小,不管是否有人在那一天注册 为此,我尝试在DO语句中使用For循环-碰巧我在只读环境中工作,甚至不能声明函数。遗憾的是,我不能让它工作。要么我做错了什么,要么在这样的限制下是不可能的。这是我的密码: DO $do$ BEGIN FOR i IN 0..90 LOOP RETURN QUERY ( SELE
users
,我需要获取给定日期该表中过去90天的用户数-这是为了跟踪新用户在系统中注册的速率
在这一点上,我需要得到每天桌子的大小,不管是否有人在那一天注册
为此,我尝试在DO
语句中使用For
循环-碰巧我在只读环境中工作,甚至不能声明函数。遗憾的是,我不能让它工作。要么我做错了什么,要么在这样的限制下是不可能的。这是我的密码:
DO
$do$
BEGIN
FOR i IN 0..90 LOOP
RETURN QUERY (
SELECT i "count", (current_date - i) "date", COUNT(u.id) "users"
FROM users u
WHERE date_trunc('day', u.created::timestamptz at time zone 'pst') <= (current_date - i)
GROUP BY (current_date - i);)
END LOOP;
RETURN;
END
$do$;
但我只知道
ERROR: cannot use RETURN QUERY in a non-SETOF function Position: 165
或者类似的返回下一个,如果我尝试了那个
除了更好地学习SQL之外,我还可以做些什么来获得期望的结果呢?您不需要为此使用循环或PL/pgSQL
您可以使用生成一个90天的列表,然后将其加入到users表中
select g.dt::date as "date"
count(*) as "users"
from generate_series(current_date - 90, current_date, interval '1 day') as g(dt)
left join users u on u.created_at::date = g.dt::date
group by g.dt::date
order by g.dt::date desc;
您不需要为此使用循环或PL/pgSQL
您可以使用生成一个90天的列表,然后将其加入到users表中
select g.dt::date as "date"
count(*) as "users"
from generate_series(current_date - 90, current_date, interval '1 day') as g(dt)
left join users u on u.created_at::date = g.dt::date
group by g.dt::date
order by g.dt::date desc;
这非常有效,只需稍作调整:它不是在u.created\u at::date=g.dt::date上左加入用户u,而是在u.created\u at::date上左加入用户u,这非常有效,稍微调整一下:它应该是在u.created_::date=g.dt::date在u.created_::date左加入用户u,而不是在u.created_::date左加入用户u