【问题标题】: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 sql-server-2008 greatest-n-per-group


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多