2014-03-19 163 views
-2

示例数据为:过滤SQL查询?


l16seqno | l16lcode | carrno | ecarrno | l16qty | reasoncode
32001 | 12 | 207620 | 370036873034035916 | 32 | 0
32269 | 12 | 207620 | 370036873034035916 | -32 | 800
39075 | 12 | 207620 | 370036873034035916 | 32 | 0
39074 | 12 | 207622 | 370036873034035923 | 32 | 0
32268 | 12 | 207622 | 370036873034035923 | -32 | 800
31999 | 12 | 207622 | 370036873034035923 | 32 | 0
32271 | 12 | 207624 | 370036873034035930 | -32 | 800
32005 | 12 | 207624 | 370036873034035930 | 32 | 0
39077 | 12 | 207624 | 370036873034035930 | 32 | 0

我记录了表Z02T1中的所有事件。每当我有llclcode = 12时 - 我正在阻止或取消阻止托盘。当我挡住一个托盘时,l16ltyty feild是负面的,当我解锁时 - 这是正面的。

原因代码可以在Z02T2表中找到(可以通过l16seqno连接到Z02T1 - 每个日志记录的唯一序列号)。

Z14T1表包含有关托盘 - 托盘编号的信息。

我的目标是要找到两行每个托盘即

与代码800阻塞时......然后......当畅通与代码0

为此,我必须要找到最近的下一个记录对于原因代码为0的相同货盘(在此原因代码为800的货盘有记录之后),l16lcode = 12。

我已经作出初步查询是:

select Z02T1.datreg, Z02T1.l16seqno, Z02T1.l16lcode, Z02T1.divcode, Z02T1.carrno, 
     Z14T1.ecarrno, Z02T1.l16qty, Z02T2.reascode from Z02T2 
inner join Z02T1 on Z02T1.l16seqno=Z02T2.l16seqno 
left outer join Z14T1 ON Z14T1.carrno=Z02T1.carrno 
where Z02T1.l16lcode=12 
and (Z02T2.reascode=800 or Z02T2.reascode=0) 
order by Z14T1.ecarrno 

如何我可以改变这个查询来获取一个纪录reasoncode 800,然后第二天纪录reasoncode 0为同一ecarrno费尔德

+0

这是sql-server OR oracle吗?没有PL/SQL删除标签。 – OldProgrammer

+0

它是用于SQL服务器 – Hansen

+0

@Hansen- SS的哪个版本? –

回答

0

这里是你可以用它来修改现有查询的一些示例代码。

注意,这个例子上的reasoncode=800,然后子滤镜上的reasoncode=0第一次出现,有一个l16seqnoreasoncode=800记录越大,第一次出现的过滤器。

CREATE TABLE reasons (
    l16seqno int NOT NULL, 
    carrno int NOT NULL, 
    reasoncode int NOT NULL 
); 

INSERT INTO reasons 
    (l16seqno, carrno, reasoncode) 
VALUES 
    (1, 1, 0), 
    (2, 1, 800), 
    (3, 1, 0), 
    (10, 300, 0), 
    (11, 300, 800), 
    (12, 300, 0), 
    (13, 300, 800), 
    (14, 300, 0), 
    (1003, 1212, 0), 
    (1004, 1212, 800), 
    (1005, 1212, 0), 
    (1006, 1212, 0); 

WITH cte1 (l16seqno, carrno, reasoncode, rownumber) 
AS 
(
    SELECT l16seqno, carrno, reasoncode, ROW_NUMBER() OVER (PARTITION BY carrno, reasoncode ORDER BY l16seqno) 
    FROM reasons 
    WHERE reasoncode = 800 
), 
cte2 (l16seqno, carrno, reasoncode, rownumber) 
AS 
(
    SELECT r.l16seqno, r.carrno, r.reasoncode, ROW_NUMBER() OVER (PARTITION BY r.carrno, r.reasoncode ORDER BY r.l16seqno) 
    FROM reasons AS r 
    INNER JOIN cte1 AS c ON r.carrno = c.carrno 
    WHERE r.reasoncode = 0 AND r.l16seqno > c.l16seqno 
) 
SELECT r.l16seqno, r.carrno, r.reasoncode 
FROM reasons AS r 
LEFT OUTER JOIN cte1 AS c1 ON c1.l16seqno = r.l16seqno 
LEFT OUTER JOIN cte2 AS c2 ON c2.l16seqno = r.l16seqno 
WHERE c1.rownumber = 1 
OR c2.rownumber = 1 
ORDER BY r.carrno, r.l16seqno; 

这里是上面列出的示例代码的SQL Fiddle demo

我希望这会有所帮助。

+0

谢谢Laszlo ..对你的帮助...我试着让它工作,它给出了预期的结果。你真好:) – Hansen

0

在这里你去:

;with cte as 
(
    Select l16seqno 
      ,l16lcode 
      ,carrno 
      ,ecarrno 
      ,l16qty 
      ,reasoncode 
      ,ROW_NUMBER() Over(Partition By ecarrno, reasoncode Order By l16seqno) rn 
    From MyTable 
) 
Select l16seqno 
     ,l16lcode 
     ,carrno 
     ,ecarrno 
     ,l16qty 
     ,reasoncode 
From cte 
Where rn = 1 
Order By ecarrno asc, reasoncode desc 
+0

感谢您的回复..戴夫!让我尝试一下,然后我会回复你 – Hansen