2011-08-04 4 views
1

J'ai du mal à écrire une requête basée sur le tableau ci-dessous qui devrait obtenir des enregistrements incorrects pour un emplacement (où BadRec = 1) et aussi 3 enregistrements précédents (Max) sur cet emplacement incluant les mauvais enregistrements;Requête SQL pour trouver les enregistrements précédents

TranDate    Location BadRec 
======================= ======== ====== 
2010-08-25 00:00:00.000 STN-2  0 
2010-08-26 00:00:00.000 STN-2  1 
2010-08-27 00:00:00.000 STN-1  1 
2010-08-28 00:00:00.000 STN-1  0 
2010-08-28 00:00:00.000 STN-2  1 
2010-08-29 00:00:00.000 STN-1  0 
2010-08-30 00:00:00.000 STN-1  1 
2010-08-31 00:00:00.000 STN-1  0 
2010-09-01 00:00:00.000 STN-1  0 

Voici les attendus eteint;

TranDate    Location BadRec comments 
======================= ======== ====== ======== 
2010-08-30 00:00:00.000 STN-1  1 <- Bad record on STN-1 
2010-08-29 00:00:00.000 STN-1  0 <- First Previous record 
2010-08-28 00:00:00.000 STN-1  0 <- Second Previous record 
2010-08-27 00:00:00.000 STN-1  1 <- Third Previous record (Previous include bad rec) 
2010-08-28 00:00:00.000 STN-2  1 <- Bad record on STN-2 
2010-08-26 00:00:00.000 STN-2  1  
2010-08-25 00:00:00.000 STN-2  0  
2010-08-27 00:00:00.000 STN-1  1 <- Bad record on STN-1,No previous record for this 
2010-08-26 00:00:00.000 STN-2  1 <- Bad record on STN-2 
2010-08-25 00:00:00.000 STN-2  0  

Est-ce possible d'écrire ceci en utilisant une seule requête ?? En utilisant CTE ?? Plus (partition ...) ?? Toute aide est bien appréciée. Remarque: je suis sur une machine SQL 2005;

+1

Pourquoi '2010-08-27 00: 00: 00.000 STN-1 1' répète-t-il deux fois dans la sortie attendue? – Chandu

+0

Je pense que «2010-08-27 00: 00: 00.000 STN-1 1» apparaît d'abord comme une ligne précédente pour 2010-08-30 et la seconde comme une ligne BadRec. – bobs

+0

Merci un bobs !! C'était exactement ce que je cherchais! Appréciez vous aider – user173552

Répondre

1

Est-ce que cela fait ce que vous voulez?

SELECT TranDate, Location, BadRec 
FROM 
    (
    SELECT pr.TranDate, pr.Location, pr.BadRec, 
     ROW_NUMBER() OVER (PARTITION BY r.TranDate ORDER BY pr.TranDate DESC) AS SEQUENCE 
    FROM Records r 
    JOIN Records pr ON r.Location = pr.Location 
        AND r.TranDate >= pr.TranDate 
    WHERE r.BadRec = 1 
    ) x 
WHERE SEQUENCE <= 4 
+0

+1, ajouter une commande peut-être pour avoir les mêmes résultats: http://data.stackexchange.com/stackoverflow/qe/1683/sql-query-to-find-previous-records –

Questions connexes