在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
你能發佈SQL查詢,讓你你上面貼的結果呢? –
以「*'...標記行」開始的段落甚至不是很清晰。我們沒有模糊的想法,你的開始和結束真正代表什麼。你需要澄清哪些事情應該和不應該出現的規則。 「最新的每個TPN」很簡單,但系統應該如何按開始和結束進行分區?是否需要每個獨特的開始/結束組合的最新TPN? – Thomas
@Thomas好吧,對不起。我雖然很清楚,但我可能只是很單純。讓我重試。對於表格中的每一行,我想檢查每個不同TPN的最新開始/結束組合;如果開始/結束組合符合某個條件(例如開始= 6和結束= 3),那麼我需要檢查同一TPN的前一個(按照時間順序排列)組合,然後才能決定是否考慮TPN 。如果必須考慮TPN,我將選擇具有最新開始/結束組合的行。希望它更清楚,但可能它不是... – rodedo