首页 > 解决方案 > 如何为此用例编写 SQL 查询?

问题描述

假设我有一个包含三个字段的表:event_name, event_timestamp event_result. 每一行都是一个事件 event_name的发生,发生在event_timestampsome event_result。例如:

 event_name | event_timestamp  | event_result
 -------------------------------------------
 event_a    | 2018-04-29 00:00 | result_x1
 event_a    | 2018-04-29 00:00 | result_x2
 event_b    | 2018-04-29 00:00 | result_x1
 event_a    | 2018-04-29 00:00 | result_x3
 event_b    | 2018-04-29 00:00 | result_x3

现在我需要一个 SQL 查询来为给定范围内的每一行选择最新 的行。event_timestamp event_nameevent_timestamp

您将如何编写这样的查询?我想它应该是适用于任何合理 SQL 数据库的标准 SQL。

标签: sql

解决方案


使用subquery

select * 
from table t
where event_timestamp = (select max(event_timestamp) 
                         from table 
                         where event_name = t.event_name);

而且,一般来说最有效的方法是使用排名函数(如果支持)

select * from (
      select *,
             row_number() over (partition by event_name order by event_timestamp desc) Seq 
      from table t
      where  event_timestamp between @start and @end
) t
where Seq = 1;

推荐阅读