SQL不排序和分组

我正在编写此SQL查询,以检测最近登录系统的用户。截至目前我拥有的查询:

SELECT * FROM (
    SELECT * FROM events WHERE eventName = 'Login' ORDER BY eventID DESC
) AS SUBQUERY 
GROUP BY personID;

这是我要从中读取的原始表:

+---------+----------+-----------+--------------+----------------------------+
| eventID | personID | eventName | eventContent | timeStamp                  |
+---------+----------+-----------+--------------+----------------------------+
|       1 |        2 | Login     | Login        | On: 26/12/2019 at 16:53:34 |
|       2 |        2 | Click     | Button       | On: 26/12/2019 at 16:53:42 |
|       3 |        1 | Login     | Login        | On: 26/12/2019 at 16:53:43 |
|       4 |        1 | Login     | Login        | On: 26/12/2019 at 16:59:22 |
|       5 |        0 | Login     | Login        | On: 26/12/2019 at 17:4:34  |
|       6 |        1 | Login     | Login        | On: 26/12/2019 at 17:5:6   |
+---------+----------+-----------+--------------+----------------------------+

我期望的输出:

ID  Login Time
1   On: 26/12/2019 at 17:5:6
0   On: 26/12/2019 at 17:4:34
2   On: 26/12/2019 at 16:53:34

输出SQL给我:

ID  Login Time
0   On: 26/12/2019 at 17:4:34
1   On: 26/12/2019 at 16:53:43
2   On: 26/12/2019 at 16:53:34

tfqguo 回答:SQL不排序和分组

我了解您希望每LoginTime使用最新的ID

只需涉及两列,就可以使用聚合:

select personID ID,max(timestamp) LoginTime from mytable group by personID

如果出于某种原因您需要从表中获取更多列,则可以使用相关子查询进行过滤:

select t.*
from mytable t
where t.timestamp = (
    select max(t1.timestamp) from mytable t1 where t1.personID = t.personID
)
,

由于您的ORDER语句位于内部子查询中,因此对最终选择具有 效果。

相反,您应该将ORDER BY语句移到分组语句之外...

我必须质疑您为什么要使用子查询,使用select *GROUP BY会从组中返回一条记录是正确的,在其他RDBMS中,这种查询无效,我们必须指定要返回的特定字段,包括要用于不属于grouping语句的列的所有聚合表达式。

本文链接:https://www.f2er.com/2859118.html

大家都在问