2011-08-04 152 views
1

我很努力地写一个基于下面的表的查询应该得到一个位置(其中BadRec = 1)的Bad记录以及该位置上的前3个记录(Max),包括坏记录;SQL查询查找以前的记录

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 

这里是预期的推出;

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  

这是可能写这个使用单个查询?使用CTE?结束(分区...)??任何帮助,非常感谢。 注意:我在SQL 2005机器上;

+1

为什么'2010-08-27 00:00:00.000 STN-1 1'在预期输出中重复两次? – Chandu

+0

我认为'2010-08-27 00:00:00.000 STN-1 1'首先出现在2010-08-30的前一行,第二行作为BadRec行出现。 – bobs

+0

谢谢鲍勃!那正是我正在寻找的!感谢您的帮助 – user173552

回答

1

这是做你想做的吗?

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,添加一个订单也许有完全相同的结果:http://data.stackexchange.com/stackoverflow/qe/1683/sql-query-to-find-previous-records –