Reputation: 42050
Suppose I've got a table with three fields: event_name
, event_timestamp
event_result
. Each row is an occurrence of an event event_name
occurred at event_timestamp
with some event_result
. For example:
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
Now I need a SQL query to select rows with the latest event_timestamp
for every event_name
within given range of event_timestamp
.
How would you write such a query ? I guess it should be standard SQL that works with any reasonable SQL database.
Upvotes: 1
Views: 104
Reputation: 50163
Use subquery
:
select *
from table t
where event_timestamp = (select max(event_timestamp)
from table
where event_name = t.event_name);
And, in general the most effective method is to use ranking functions (if support)
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;
Upvotes: 2
Reputation: 633
this code work for ms sql
SELECT *
FROM
(SELECT
*, ROW_NUMBER() OVER(PARTITION BY event_name ORDER BY event_timestamp DESC) AS row_no
FROM Event
WHERE
event_timestamp BETWEEN @BeginDate AND @EndDate) as tbl
WHERE row_no = 1
Upvotes: 0
Reputation: 968
SELECT * FROM `your_table`
WHERE `event_timestamp` BETWEEN 'your_start_range'AND 'your_end_range'
GROUP BY `event_name`
ORDER BY `event_timestamp` DESC
LIMIT 1;
Upvotes: 0
Reputation: 2421
you can use group by and include the max event_timestamp In MSSQL:
select
event_name
, MAX(event_timestamp)
from [table_name]
where event_timestamp between '2018-04-20' and '2018-04-30'
group by event_name
Upvotes: 0
Reputation: 15140
The most portable solution would probably be something like:
SELECT E.*
FROM Event E
INNER JOIN (
SELECT event_name
, MAX(event_timestamp) MAX_DT
FROM Event
WHERE event_timestamp <= @SomeDate
AND event_timestamp > @SomeOtherDate
GROUP BY event_name
) MAXED
ON MAXED.event_name = E.event_name
AND MAXED.MAX_DT = E.event_timestamp
Upvotes: 1
Reputation: 14389
Something like:
SELECT event_name
,MAX(event_timestamp)
FROM myTable
WHERE event_timestamp BETWEEN date1
AND date2
GROUP BY event_name
Upvotes: 0