2013-11-04 31 views
0

我有一個數據庫用於跟蹤物理對象的位置,我們稱之爲小部件。它有一個審計追蹤表,追蹤widget何時放入某個位置,以及何時離開某個位置(以及之後的位置)。SQL查詢將審計線索的輸入/輸出時間轉換爲位置列表

所以在概念上,它看起來像這樣

Widget ID Date   Old Location New Location 
1   01-Oct-2013 NULL   101 
1   03-Oct-2013 101   108 
1   08-Oct-2013 108   101 
2   01-oct-2013 NULL   101 
2   02-Oct-2013 101   103 
3   12-oct-2013 NULL   101 

我希望能夠查詢列表,它的部件是在開始和結束日期之間的位置101,如十月8日至9日到2013年,這應該是小部件1而不是小部件2或3.

我不知道如何獲取所有這些情況。我可以提取最後移入的小部件列表,以及在開始之前移出的小部件列表,但這也會消除小部件1在離開和返回時的狀態。

我想我需要將它轉換爲一個表格,包含窗口小部件,位置,入口日期和退出日期,但我不知道該怎麼做?

編輯:正如指出的,我的數據是錯誤的,我已經更新,使問題8日至9日(這是第4至第5)。所以Widget 1是該時期101位置中唯一的小部件。

+0

你想知道小部件進來或期末留? – LINQ2Vodka

+0

我想知道在期間 – PaulHurleyuk

+0

期間任何時候小部件是否在位置。因此,您需要找到至少1條記錄,其中新位置是101並且日期在週期內 - 用於每個小部件ID。請在我的答案中檢查更新。 – LINQ2Vodka

回答

1

嘗試是這樣的:

select * 
from 
(select "Widget ID" id, 
"New Location" loc, 
"Date" start_date, 
lead("Date", 1, sysdate) over (partition by "Widget ID" order by "Widget ID") end_date 
from widgets) t 
where t.loc = 101 
and start_date < <<your_ending_date>> and end_date > <<your_starting_date>> 

here is a sqlfiddle demo(請注意,我改變了你的數據一點點)

1

所以你需要每個小部件在期限內的最後一個狀態。
可能需要選擇日期之間所有小部件的子選擇語句,按id將它們分組,按照Date desc排序,選擇top 1,這樣就知道小部件在該時間段內的最後一個狀態。根據新的條件

我想知道,如果小部件是在位置隨時在 期間

你讓選擇具有獨特的ID和一個子查詢

UPDATE使用EXISTS檢查結果集中是否包含當前ID和日期以及新位置= X的行。這會讓你知道哪些物品至少要存放一次。

+0

這就是我到達的地方,但我不需要最後的狀態。在我的問題中,小部件1中的數據在此期間沒有交易,但是在期間之前移入,移出並返回。我想我需要將這些排配對,但我不知道如何做到這一點? – PaulHurleyuk

+0

所以你需要在日期之前得到每個小部件的最後狀態,對吧?我的意思是,你指定了一些「dd-mm-yyyy」,在這個日期之前選擇所有行,並通過每個id查看最後的交易。這是你需要的嗎? – LINQ2Vodka

+0

讓我們來澄清一下你的問題......你需要一段時間內一直在商店裏的itams嗎?或者通過skype skvoznik與我聯繫 – LINQ2Vodka