选择不同的行,同时按最大值分组
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
【讨论】:
以上是关于选择不同的行,同时按最大值分组的主要内容,如果未能解决你的问题,请参考以下文章