postgresql результат запроса с использованием условия где другой запрос - PullRequest
0 голосов
/ 04 августа 2020

Моя цель - определить все имена пользователей и подсчитать время входа в систему за 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;

список_переменных = (имя_пользователя1, имя_пользователя2, ...)

запустить этот запрос для каждого имени пользователя в списке_переменных

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

как я могу это сделать? и как правильно решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Используйте 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"
0 голосов
/ 04 августа 2020

Думаю, вам просто нужна фраза 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;
...