Revision: 69237
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at May 14, 2015 03:59 by bvwatson
Initial Code
-- Let's restate the problem and solve it in pieces. Then put the pieces together.
-- CREATE THE DATA
create table theTable (
id int,
updated_by varchar(20),
update_date date
);
begin work;
insert into theTable (id, updated_by, update_date) VALUES (1,"XYZ",DATE "2015-05-11");
insert into theTable (id, updated_by, update_date) VALUES (1,"ABC",DATE "2015-05-10");
insert into theTable (id, updated_by, update_date) VALUES (1,"CDE",DATE "2015-05-09");
insert into theTable (id, updated_by, update_date) VALUES (2,"ABC",DATE "2015-05-11");
insert into theTable (id, updated_by, update_date) VALUES (2,"XYZ",DATE "2015-05-10");
insert into theTable (id, updated_by, update_date) VALUES (3,"XYZ",DATE "2015-05-11");
insert into theTable (id, updated_by, update_date) VALUES (3,"XYZ",DATE "2015-05-10");
insert into theTable (id, updated_by, update_date) VALUES (3,"CDE",DATE "2015-05-09");
commit;
-- WHAT'S IN THE TABLE?
select id, updated_by, update_date from theTable;
-- (1) WHEN WAS EACH ROW MOST RECENTLY UPDATED?
select id, max(update_date) as "max_update_date"
from theTable
group by id;
-- (2) WHO MADE THAT UPDATE?
select id, updated_by, update_date
from theTable
where (id, update_date) in (
select id, max(update_date) as "max_update_date"
from theTable
group by id
);
-- (3) WHEN WERE ALL THE PREVIOUS UPDATES FOR THAT ROW?
select secondUpdate.id, secondUpdate.update_date
from theTable secondUpdate
join (
select id, max(update_date) as "max_update_date"
from theTable
group by id
) lastUpdate
on secondUpdate.id = lastUpdate.id
and secondUpdate.update_date < lastUpdate.max_update_date
;
-- (4) WHAT'S THE MOST RECENT OF THOSE PREVIOUS UPDATES?
select secondUpdate.id, max(secondUpdate.update_date) max_previous_date
from theTable secondUpdate
join (
select id, max(update_date) as "max_update_date"
from theTable
group by id
) lastUpdate
on secondUpdate.id = lastUpdate.id
and secondUpdate.update_date < lastUpdate.max_update_date
group by secondUpdate.id;
-- (5) WHO MADE THAT LAST PREVIOUS UPDATE?
select T.id,T.updated_by, T.update_date
from theTable T
join (
select secondUpdate.id, max(secondUpdate.update_date) max_previous_date
from theTable secondUpdate
join (
select id, max(update_date) as "max_update_date"
from theTable
group by id
) lastUpdate
on secondUpdate.id = lastUpdate.id
and secondUpdate.update_date < lastUpdate.max_update_date
group by secondUpdate.id
) lastPreviousUpdate
on T.id = lastPreviousUpdate.id
and T.update_date = lastPreviousUpdate.max_previous_date
;
-- (6) NOW GET BOTH OF THEM
select L.id "Record", L.updated_by "lastUpdater", L.update_date "lastUpdate", P.updated_by "prevUpdater", P.update_date "prevUpdate"
from
(
select id, updated_by, update_date
from theTable
where (id, update_date) in (
select id, max(update_date) as "max_update_date"
from theTable
group by id
)
) L
LEFT JOIN
(
select T.id, T.updated_by, T.update_date
from theTable T
join (
select secondUpdate.id, max(secondUpdate.update_date) max_previous_date
from theTable secondUpdate
join (
select id, max(update_date) as "max_update_date"
from theTable
group by id
) lastUpdate
on secondUpdate.id = lastUpdate.id
and secondUpdate.update_date < lastUpdate.max_update_date
group by secondUpdate.id
) lastPreviousUpdate
on T.id = lastPreviousUpdate.id
and T.update_date = lastPreviousUpdate.max_previous_date
) P
on L.id = P.id
order by L.id
;
Initial URL
Initial Description
Created as reply to question on ittoolbox.com:"Need your help in writing a query to pull audit history i.e. Last updated by a user 'XYZ' and for the same record key (ID) the second last record in the audit history table. i.e. Last update by this user and the previous updated record to this record by anybody e.g. " http://database.ittoolbox.com/groups/technical-functional/sql-l/sql-to-find-records-updated-by-particular-user-and-the-prior-one-5732386 This snippet is written to show a step-by-step process of building the query to produce the results. It started with the simple query, then builds on that to the final query and results.
Initial Title
Find last two updates to a record
Initial Tags
sql, date
Initial Language
MySQL