选择不同的行,同时按最大值分组

Posted

技术标签:

【中文标题】选择不同的行,同时按最大值分组【英文标题】:Select distinct rows whilst grouping by max value 【发布时间】:2013-07-22 19:18:29 【问题描述】:

我目前有下表:

ID   |  Name    |  EventTime            |  State
1001 |  User 1  |  2013/07/22 00:00:05  |  15
1002 |  User 2  |  2013/07/23 00:10:00  |  100
1003 |  User 3  |  2013/07/23 06:15:31  |  35
1001 |  User 1  |  2013/07/23 07:13:00  |  21
1001 |  User 1  |  2013/07/23 08:15:00  |  25
1003 |  User 3  |  2013/07/23 10:00:00  |  22
1002 |  User 2  |  2013/07/23 09:18:21  |  50

我需要的是state 与最后一个eventtime 不同的userid,类似于下面:

ID   |  Name    |  EventTime            |  State
1001 |  User 1  |  2013/07/23 08:15:00  |  25
1003 |  User 3  |  2013/07/23 10:00:00  |  22
1002 |  User 2  |  2013/07/23 09:18:21  |  50

我需要类似以下的东西,但我无法完全得到我需要的东西。

SELECT ID, Name, max(EventTime), State
FROM MyTable
GROUP BY ID

【问题讨论】:

SQL server select distinct rows using most recent value only 的可能重复项 【参考方案1】:

你可以试试这个:-

SELECT ID, Name, EventTime, State
FROM mytable mm Where EventTime IN (Select MAX(EventTime) from mytable mt where mt.id=mm.id)

SQL FIDDLE

【讨论】:

这不会将 MAX(EventTime) 与 ID 相关联,它只是限制任何 ID 的 MAX() 事件时间,如果一个 ID 的非最大事件时间会失败恰好是另一个 ID 的最大值。 @Goat CO 你说得对,兄弟。你说的我明白了。我已经更新了它,它现在工作正常。 :) 是的,它修复了它,它现在是一个相关的子查询,所以它正在评估每个 ID 的最大值。它可以很容易地使用 = 而不是 IN,因为子查询每个 ID 返回一个值。【参考方案2】:

您没有指定您使用的数据库,但您应该能够在子查询中使用聚合函数来获取每个 id 的最大事件时间:

select t1.id,
  t1.name,
  t1.eventtime,
  t1.state
from mytable t1
inner join
(
  select max(eventtime) eventtime, id
  from mytable
  group by id
) t2
  on t1.id = t2.id
  and t1.eventtime = t2.eventtime
order by t1.id;

见SQL Fiddle with Demo

【讨论】:

【参考方案3】:
SELECT
ID, Name, EventTime, State
FROM
MyTable mt
WHERE EventTime = (SELECT MAX(EventTime) FROM MyTable sq WHERE mt.ID = sq.ID)

【讨论】:

虽然我更喜欢row_number(),但这在某些情况下可能表现最好。 这也是标准 SQL :) Row_number() 并非随处可用。 。 . row_number() ANSI标准SQL。问题是,没有真正的数据库真正实现了该标准。 哦,真的吗?好吧,不知道。感谢您的信息。【参考方案4】:

在支持解析函数的数据库中,可以使用row_number()

select  *
from    (
        select  row_number() over (partition by ID 
                                   order by EventTime desc) as rn
        ,       *
        from    YourTable
        ) as SubQueryAlias
where   rn = 1

【讨论】:

以上是关于选择不同的行,同时按最大值分组的主要内容,如果未能解决你的问题,请参考以下文章

Mysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行

BigQuery 在选择不同行时按一个字段中的最大值分组

从 Postgres 记录中的行中获取最大值并按多列分组

从表中选择具有最大日期的行

在特定列 postgres 中选择具有最大值的组中的行

雄辩地通过分组找到具有最大值的行