Postgres DB,如何只得到一个结果

Postgres DB, how to only get one result

为简单起见,数据库如下所示:

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,则用户在给定的 "timestamp".

登录到 "name2" 中给定的集合

如果状态为 6 或 8,则用户已从集合中注销。 现在,用户一天可能会登录和注销几次。 但是我需要弄清楚现在登录的是哪个用户。

更新:一台设备上可以同时登录多个用户。 我更新了 table.

为了清楚起见,在此示例中我需要以下输出:

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

任何提示我如何得到它? 我现在就这个主题工作了两天...问 google,来到这里,但对我帮助不大。

这对我不起作用,因为我得到了所有用户,不管他们是最近登录还是注销...

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

亲切的问候 日本

尝试将 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;

我也不认为你需要比降序时间戳更多的排序,因为上面的查询只有 returns 登录到 set1

参考:www.postgresqltutorial.com

N.B. 这实际上会给你最后一个登录set1的用户;从那以后他们就可以注销了。

你真的想检查 set1 的最新 activity,只有 return 它是 2。

也许其他人可以改进我的答案,但我让你更进一步

现在我和我的同事找到了解决方案:

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;