2014-03-19 159 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