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
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;
为简单起见,数据库如下所示:
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
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;