如何运行';对于';在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