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

Posted

技术标签:

【中文标题】postgresql 查询结果使用 where 条件另一个查询【英文标题】:postgresql query result using where condition another query 【发布时间】: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()

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

【问题讨论】:

【参考方案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 计数。

以上是关于postgresql 查询结果使用 where 条件另一个查询的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 函数不适用于 WHERE 子句

PostgreSQL 子查询

PostgreSQL 子查询

在 PostgreSQL 的 WHERE 子句中使用函数结果

如何在 Ruby 中使用 Where 子句 (PostgreSQL) 中的变量编写查询

postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写