【问题标题】:postgresql query result using where condition another querypostgresql 查询结果使用 where 条件另一个查询
【发布时间】:2020-08-04 13:54:59
【问题描述】:

我的目标是检测所有用户名并在 24 小时内计算每个用户名的登录时间。 我是单独的仪式代码,但我不能合并它。

SELECT
   DISTINCT "username"
FROM
   my_table;

我的第二个查询是让我统计与此用户名相关的日志

select count(*) 
from my_table as "foo" where "username" = 'example_username' and  "foo"."timestamp" BETWEEN NOW() - INTERVAL '24 HOURS' AND NOW()

我想写一个查询这个查询检测唯一/不同的用户名并返回每个用户名的最近 24 小时日志

如果我们认为这个查询返回一个变量列表

SELECT
   DISTINCT "username"           
FROM
   my_table;

variable_list =(username1,username2,...)

为 variable_list 中的每个用户名运行该查询

select count(*) 
from my_table as "foo" where "username" = 'example_username' and  "foo"."timestamp" BETWEEN NOW() - INTERVAL '24 HOURS' AND NOW()

我怎么能做到这一点?解决这个问题的正确方法是什么?

【问题讨论】:

    标签: sql postgresql sqlalchemy postgresql-12


    【解决方案1】:

    使用 CTE 创建用户列表,然后使用左连接和聚合。

    WITH user_list as (SELECT
       DISTINCT "username"
       FROM
       my_table)
    SELECT 
      user_list."username"
      ,count(*) 
    FROM user_list 
    LEFT JOIN my_table as "foo" 
       ON "foo"."username"=user_list."username"
    WHERE  "foo"."timestamp" BETWEEN NOW() - INTERVAL '24 HOURS' AND NOW()
    GROUP BY user_list."username"
    

    【讨论】:

      【解决方案2】:

      我想你只想要一个WHERE 子句。假设您没有未来的时间戳:

      SELECT DISTINCT username         
      FROM my_table
      WHERE timestamp >= NOW() - INTERVAL '24 HOURS' ;
      

      如果要统计过去 24 小时内的用户,请使用聚合:

      SELECT username, COUNT(*) FILTER (WHERE timestamp >= NOW() - INTERVAL '24 HOURS')     
      FROM my_table
      GROUP BY username;
      

      【讨论】:

      • 这不会显示所有用户名,只显示最近 24 小时内登录的用户名。所以你不会有 0 计数。
      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多