使用 where 条件另一个查询的 postgresql 查询结果

postgresql query result using where condition another query

我的目标是检测所有用户名并计算每个用户名在 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()

我想写一个查询此查询检测 unique/distinct 用户名和 return 每个用户名的最近 24 小时日志

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

SELECT
   DISTINCT "username"           
FROM
   my_table;

variable_list =(用户名1,用户名2,...)

运行 查询 variable_list

中的每个用户名
select count(*) 
from my_table as "foo" where "username" = 'example_username' and  "foo"."timestamp" BETWEEN NOW() - INTERVAL '24 HOURS' AND NOW()

我该怎么做?解决这个问题的正确方法是什么?

我认为您只需要一个 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;

使用 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"