2012-06-14 61 views
0

在SQL Server中,我有一個看起來像一個表(姑且稱之爲TransList):基於在同一個表中其他行中選擇行

TPN Start End TDate      DoneBy 
10  6  7  2003-03-17 14:48:42.750 User2 * 
10  1  6  2003-03-13 08:02:09.317 User3 
11  3  6  2003-03-21 08:15:45.410 User3 ** yes 
11  6  3  2003-03-13 08:13:13.920 User4 <-- 
11  5  6  2003-03-08 17:39:51.460 User4 
12  13  3  2003-03-19 10:58:23.187 User8 * 
12  6  13  2003-03-17 14:48:42.750 User7 
12  3  6  2003-03-13 08:02:09.317 User6 
12  1  3  2003-03-01 14:09:17.167 User1 
13  3  6  2003-03-19 10:58:23.187 User1 *** no 
13  1  3  2003-03-01 14:09:17.167 User2 <-- 
14  3  6  2003-03-21 08:15:45.410 User5 ** yes 
14  13  3  2003-03-13 08:13:13.920 User6 <-- 
14  6  13  2003-03-08 17:39:51.460 User7 
15  6  3  2003-03-17 14:48:42.750 User2 * 
15  1  6  2003-03-13 08:02:09.317 User3 

這是一個相當複雜的查詢其連接兩個獨立的結果SELECT語句每個連接幾個表。行由TPN ASC, TDate DESC訂購。

我現在想過濾此表並獲得:

TPN Start End TDate      DoneBy 
10  6  7  2003-03-17 14:48:42.750 User2 
11  3  6  2003-03-21 08:15:45.410 User3 
12  13  3  2003-03-19 10:58:23.187 User8 
14  3  6  2003-03-21 08:15:45.410 User5 
15  6  3  2003-03-17 14:48:42.750 User2 

即:

  • 每個選定TPN
  • TPN最新的交易是基於其最新的狀況來選擇交易和/或其兩個最新交易

行標有*有沒有因爲(Start=6 and End=7) or (Start=13 and End=3) or (Start=6 and End=3)因此我不爲她打上**這些TPN

行不在乎其他交易都存在,因爲標有***(Start=3 and End=6) and for previous transaction (Start=6 and End=3)

行是那裏,因爲(Start=3 and End=6) but for previous transaction is not (Start=6 and End=3)

,我可能需要以進一步選擇基於哪個用戶做過以前的交易和/或具有更復雜的邏輯條件***(狀態機是複雜的,我還沒有完成檢查它),但***始終是not **

我總是隻需要檢查每個TPN的前2個事務。

我是SQL新手,我已經花了幾天的時間來試圖找出如何實現這一點。我考慮自己加入TransList,使用LIMIT或TOP或者走過桌子,但我沒有設法使這個解決方案的任何工作。

任何人都可以幫忙嗎?

編輯:
上面的表格是一個「提取」,但安德烈的要求作出迴應,這裏是查詢:

SELECT Items.[TPN], 
     [StartStatus], 
     [EndStatus], 
     [TransactionDate], 
     [TransDoneBy], 
     [CurrentStatus], 
     [Title], 
     [Severity], 
     [LastChangeDate], 
     [ChangeDoneBy], 
     [Planned], 
     [Remaining] 
FROM 
(SELECT WORKITEM as 'TPN', 
     TFIELDCHANGE.NEWSYSTEMOPTIONID as 'StartStatus', 
     TFIELDCHANGE.OLDSYSTEMOPTIONID as 'EndStatus', 
     THISTORYTRANSACTION.LASTEDIT as 'TransactionDate', 
     trans_person.LASTNAME as 'TransDoneBy' 
FROM dbo.THISTORYTRANSACTION JOIN dbo.TFIELDCHANGE ON (dbo.THISTORYTRANSACTION.OBJECTID = dbo.TFIELDCHANGE.HISTORYTRANSACTION) 
          JOIN dbo.TPERSON trans_person ON (dbo.THISTORYTRANSACTION.CHANGEDBY = trans_person.PKEY) 
WHERE dbo.TFIELDCHANGE.FIELDKEY = 4 -- Only transactions regarding status 
) Transactions 
JOIN 
(SELECT WORKITEMKEY as 'TPN', 
     TSTATE.LABEL as 'CurrentStatus', 
     PACKAGESYNOPSYS as 'Title', 
     TSEVERITY.LABEL as 'Severity', 
     TWORKITEM.LASTEDIT as 'LastChangeDate', 
     item_person.LASTNAME as 'ChangeDoneBy', 
     max(CASE TATTRIBUTEVALUE.FIELDKEY WHEN 60 THEN TATTRIBUTEVALUE.INTEGERVALUE END) as 'Planned', 
     max(CASE TATTRIBUTEVALUE.FIELDKEY WHEN 72 THEN TATTRIBUTEVALUE.INTEGERVALUE END) as 'Remaining' 
FROM dbo.TWORKITEM JOIN dbo.TSTATE ON (dbo.TWORKITEM.STATE = dbo.TSTATE.PKEY) 
        JOIN dbo.TSEVERITY ON (dbo.TWORKITEM.SEVERITYKEY = dbo.TSEVERITY.PKEY) 
        JOIN dbo.TPERSON item_person ON (dbo.TWORKITEM.CHANGEDBY = item_person.PKEY) 
        JOIN dbo.TATTRIBUTEVALUE ON (dbo.TWORKITEM.WORKITEMKEY = dbo.TATTRIBUTEVALUE.WORKITEM) 
WHERE dbo.TWORKITEM.STATE = 2 OR -- Current state: analyzed 
     dbo.TWORKITEM.STATE = 3 OR -- Current state: assigned 
     dbo.TWORKITEM.STATE = 4 OR -- Current state: suspended 
     dbo.TWORKITEM.STATE = 6 OR -- Current state: implemented 
     dbo.TWORKITEM.STATE = 7 OR -- Current state: verified 
     dbo.TWORKITEM.STATE = 13 -- Current state: verifying 
GROUP BY WORKITEMKEY, 
     TSTATE.LABEL, 
     PACKAGESYNOPSYS, 
     TSEVERITY.LABEL, 
     TWORKITEM.LASTEDIT, 
     item_person.LASTNAME 
) Items 
ON Items.TPN = Transactions.TPN 
ORDER BY Items.[TPN] ASC, [TransactionDate] DESC 
+0

你能發佈SQL查詢,讓你你上面貼的結果呢? –

+0

以「*'...標記行」開始的段落甚至不是很清晰。我們沒有模糊的想法,你的開始和結束真正代表什麼。你需要澄清哪些事情應該和不應該出現的規則。 「最新的每個TPN」很簡單,但系統應該如何按開始和結束進行分區?是否需要每個獨特的開始/結束組合的最新TPN? – Thomas

+0

@Thomas好吧,對不起。我雖然很清楚,但我可能只是很單純。讓我重試。對於表格中的每一行,我想檢查每個不同TPN的最新開始/結束組合;如果開始/結束組合符合某個條件(例如開始= 6和結束= 3),那麼我需要檢查同一TPN的前一個(按照時間順序排列)組合,然後才能決定是否考慮TPN 。如果必須考慮TPN,我將選擇具有最新開始/結束組合的行。希望它更清楚,但可能它不是... – rodedo

回答

2

看來你正在尋找一種通用的方式來比較一個集團與其前任的最新交易。

這可以通過使用ROW_NUMBER()函數來完成,並自加入這樣的:

SELECT foo 
FROM (SELECT foo, 
       Row_number() OVER (PARTITION BY TRN ORDER BY TDate) AS RN 
     FROM TranTable) AS Latest 
     LEFT JOIN (SELECT foo, 
         Row_number() OVER (PARTITION BY TRN ORDER BY TDate) AS RN 
        FROM TranTable) AS Previous 
     ON Latest.RN = Previous.RN - 1 
WHERE Latest.RN = 1 /* Get only the latest */ 
     OR (/* your criteria for two latest */ AND Latest.RN IN (1,2)) 
+0

我正在嘗試這個;到目前爲止,我有一些問題,我會嘗試更多,並回來更多的問題。根據我的表格,我認爲'TRN'應該是'TPN',對吧? – rodedo

+0

我沒有管理(尚未)使用建議的代碼,但它指出我在正確的方向,現在我有一個intermedaite步驟,將爲我做。因此提高和選擇作爲答案,謝謝! – rodedo

+0

謝謝Rodedo。很高興能幫上忙。 –

相關問題