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 子句中使用函数结果