Postgres БД, как получить только один результат - PullRequest
1 голос
/ 27 мая 2020

для простоты, вот как выглядит база данных:

state | name1 | name2 | timestamp
  2   | user1 | set1  | 2020-05-27 16:20:00
  6   | user1 | set1  | 2020-05-27 16:19:00
  8   | user2 | set1  | 2020-05-27 16:10:00
  2   | user2 | set1  | 2020-05-27 16:00:00
  2   | user3 | set1  | 2020-05-27 16:30:00
  2   | user4 | set2  | 2020-05-27 16:35:00

Объяснение:

Если состояние равно 2, пользователь вошел в систему в наборе, указанном в "name2" в заданную "timestamp".

Если состояние равно 6 или 8, пользователь вышел из системы. Теперь возможно, что пользователь входил и выходил несколько раз в день. Но мне нужно выяснить, какой пользователь сейчас вошел в систему.

ОБНОВЛЕНИЕ: на одном наборе одновременно может быть более одного пользователя. Я обновил таблицу.

Чтобы прояснить, в этом примере мне нужен следующий результат:

state | name1 | name2 | timestamp
  2   | user1 | set1  | 2020-05-27 16:20:00
  2   | user3 | set1  | 2020-05-27 16:30:00

Есть какие-нибудь подсказки, как я могу его получить? Я уже два дня работаю над этим топом c ... спросил гугл, пришел сюда, но это мне не очень помогает.

Это не работает для меня, потому что я получаю всех пользователей, не не имеет значения, вошли они в систему или вышли из нее последним ...

select  state,
        name1,
        name2,
        timestamp
from db1
where name2 = 'set1' AND timestamp >= current_date
order by timestamp desc,state,name1 limit 5;

С уважением, JP

Ответы [ 2 ]

0 голосов
/ 04 июня 2020

теперь мы с коллегой нашли решение:

SELECT a1.name1 FROM db1 AS a1
INNER JOIN (SELECT MAX(timestamp) AS t_max, name1 from db1
where name2 = 'set1'
AND timestamp >= current_date
GROUP BY name1) AS a2
ON a1.timestamp = a2.t_max AND a1.name1 = a2.name1
WHERE a1.state = 2
GROUP BY a1.name1;
0 голосов
/ 27 мая 2020

Попробуйте добавить state = 2 в предложение where и настройку limit 1, например:

select  state,
        name1,
        name2,
        timestamp
from db1
where name2 = 'set1' AND timestamp >= current_date AND state = '2'
order by timestamp desc limit 1;

Я также не думаю, что вам нужно больше сортировки, чем убывающая временная метка, поскольку приведенный выше запрос возвращает только логины to set1

Ссылка: www.postgresqltutorial.com

NB Это фактически даст вам последнего пользователя, вошедшего в set1; с тех пор они могли выйти из системы.

На самом деле вы хотите проверить последнее действие для set1 и вернуть его только в том случае, если оно равно 2.

Может быть, кто-то еще может улучшить мой ответ, но у меня есть вы далее

...