2012-10-26 5 views
0

J'ai une table qui stocke l'historique des modifications de statut à une personne comme ceci:requête SQL pour obtenir les données historiques de la table

id | username | date | status 

Le champ de date est lorsque l'état a été mis à jour et le champ d'état contient la nouveau statut que la personne a depuis cette date.

donc la date dans ma table pourrait être quelque chose comme ceci:

 
1 | serafeim | 2012-03-03 | "NEW" 
2 | john | 2012-03-05 | "NEW" 
3 | serafeim | 2012-03-13 | "PENDING" 
4 | serafeim | 2012-03-15 | "OLD" 
5 | john | 2012-03-05 | "PENDING" 

etc etc

Maintenant, je voudrais avoir une requête pour une date précise dans le passé récupérera le statut que chaque utilisateur avait alors. Par exemple, pour 2012-04-14 Je voudrais obtenir les résultats suivants

 
serafeim | "PENDING" 
john | "NEW" 

pour 2012-03-04 je devrais

 
serafeim | "NEW" 

Quelqu'un peut-il penser à une requête SQL qui fais ça? Je ne veux pas faire cela par programme! J'utilise MySQL, mais je ne pense pas que ce soit par rapport à mon problème ...

Merci à l'avance

Répondre

3

La requête suivante identifie le dernier enregistrement d'un nom d'utilisateur donné, avant la date indiquée, et rejoint la table d'historique avec le dernier ID d'enregistrement pour récupérer le reste des détails.

SELECT a.* 
FROM 
    history a 
    JOIN (SELECT username, MAX(id) 'id' FROM history 
     WHERE date < @inputDate 
     GROUP BY username 
     ) as b 
    ON a.id = b.id 
1

Obtenez le premier enregistrement de l'utilisateur ayant la date inférieure ou égale à la date d'entrée:

declare @userid nvarchar(128) 
declare @date datetime 

SELECT userid, status 
FROM 
(
    SELECT limit 1 * FROM mytable 
    WHERE date <= @date 
    AND userid = @userid 
    ORDER by date desc 
) 

Untested! Et désolé si une erreur de syntaxe.

1

Je ne peux pas tester maintenant sur une base de données MySQL, mais cette requête devrait faire l'affaire.

La requête table2 renvoie la date maximale à laquelle vous avez enregistré un événement pour chaque nom d'utilisateur avant la date souhaitée: ce dernier doit être le dernier événement d'état pour cette personne.

La jointure obtient le statut.

select username, status from table 
join 
(
select username, max(date) as maxdate from table 
where date <= '2012-04-14' 
group by username) table2 
on table.username = table2.username and table.date = table.2maxdate 

Une autre façon pourrait être sans se joindre à

select username, status from table 
where date = (select max(date) as maxdate from table 
where date <= '2012-04-14' 
group by username) 
Questions connexes