2013-02-23 115 views
0

我試圖確定基於日期時間值的行重疊,並完全失去了如何完成此操作。我在高層讀到這裏和其他網站的回覆之後需要做些什麼,但是不知道從哪裏開始,我有一個模糊的理解。查找日期時間與基於非日期時間的標準重疊

原始數據集是分隔的,我打算在Excel,Access,Python或Perl中執行此操作。

在較大的數據集(約115,000行)內有三個不同的數據塊;蘋果,橙子和梨 - 樣品數據如下。

所述數據集的圖像,可以發現 - http://i.imgur.com/DQtmuvI.jpg

filename     network  spot_id   dt_sched    dt_insert 

APPLE_2012_10151135.VCA  APPLE  00NC8109450  01/01/2012 0:20:30  01/01/2012 0:23:10 
APPLE_2012_10151135.VCA  APPLE  0NF81700041  01/01/2012 0:20:30  01/01/2012 0:22:40 
APPLE_2012_10151135.VCA  APPLE  0NF82100170  01/01/2012 0:50:30  01/01/2012 0:48:57 
APPLE_2012_10151135.VCA  APPLE  MK882000004  01/01/2012 0:50:30  01/01/2012 0:49:27 
ORANGE_2012_10102135.VCA ORANGE  0NF82100186  01/01/2012 0:15:30  01/01/2012 0:14:27 
ORANGE_2012_10102135.VCA ORANGE  00NC8139709  01/01/2012 0:15:30  01/01/2012 0:14:57 
ORANGE_2012_10102135.VCA ORANGE  0NF82400065  01/01/2012 0:31:30  01/01/2012 0:27:08 
ORANGE_2012_10102135.VCA ORANGE  000NC899740  01/01/2012 0:31:30  01/01/2012 0:27:38 
ORANGE_2012_10102135.VCA ORANGE  0NF81700041  01/01/2012 0:50:30  01/01/2012 0:46:58 
ORANGE_2012_10102135.VCA ORANGE  000NC899740  01/01/2012 0:50:30  01/01/2012 0:47:28 
PEAR_2012_10125135.VCA  PEAR  0NF82100169  01/01/2012 0:15:30  01/01/2012 0:21:52 
PEAR_2012_10125135.VCA  PEAR  ML817000190  01/01/2012 0:15:30  01/01/2012 0:22:22 
PEAR_2012_10125135.VCA  PEAR  0NF82200043  01/01/2012 0:45:30  01/01/2012 0:47:43 
PEAR_2012_10125135.VCA  PEAR  ML803000400  01/01/2012 0:45:30  01/01/2012 0:48:13 

我需要確定在同一天,如果發生以下情況:

重疊dt_sched和

    之間dt_insert
  • 蘋果重疊橙色
  • 蘋果重疊梨
  • 橙色重疊蘋果
  • 橙重疊梨
  • 梨重疊蘋果
  • 梨重疊橙色

表中的每一網絡; Apple,Orange,Pear,包含365天的交易和24小時的個人日期。原始數據集在Excel中,我正在導入到Access。

+3

爲什麼不將該示例數據集複製並粘貼到您的文章中?截圖旁邊沒用,我們重現您的設置。 – 2013-02-23 16:58:07

+0

您需要[編輯]您的問題以添加該信息。 – 2013-02-23 17:19:20

+1

「overlapped」是指以下內容:(1)在每一行中'dt_sched'定義時間間隔的開始,'dt_insert'定義間隔的結束; (2)如果網絡「A」的任何間隔與網絡「B」的任何間隔重疊,則給定日期的兩個網絡「A」和「B」重疊?這意味着如果A重疊B,那麼根據定義B重疊A. – 2013-02-23 18:09:46

回答

0

沒有一個特別有效的方法來做到這一點。下面給出SQL解決方案:

select cdate(int(t1.dt_sched)) as thedate, t1.network, t2.network, count(*) as numoverlaps 
from t t1 join 
    t t2 
    on int(t1.dt_sched) = int(t2.dt_sched) and 
     t1.dt_sched <= t2.dt_insert and 
     t2.dt_sched <= t1.dt_insert 
group by cdate(int(t1.dt_sched)), t1.network, t2.network 

注意:我沒有測試過這個查詢,所以它可能有語法錯誤。

這將決定任何兩個網絡之間的重疊。如果您不關心同一網絡上的重疊,請包括where t1.network <> t2.network。如果有其他的網絡不是列出的網絡,那麼在(網絡列表在這裏)和t2.network中(網絡列表在這裏)包含`t1.network。

+0

謝謝你,戈登。作爲一名SQL初學者,我假設根據您的查詢,您希望網絡位於不同的表中,對嗎?如果所有記錄都放在一張表中呢? – 2013-02-23 17:24:17

+0

這假定所有的記錄都在一個表中,它們在問題中描述的方式。如果它們位於不同的表中,它不會簡化SQL。 – 2013-02-23 17:28:29

+1

Gordon,我認爲't'是你的例子中我的表的名字。我試圖在Access中運行查詢,並得到'FROM子句'中的'語法錯誤'消息正在執行。 (t1.dt_sched))int(t1.dt_sched)= int(t2.dt_sched))作爲date,t1.network,t2.network,count(*)作爲numoverlapsfrom小t1加入 小t2 on int(t1.dt_sched)= int(t2.dt_sched) )和 t1.dt_sched <= t2.dt_insert和 t2.dt_sched <= t1.dt_insert 其中t1.network <> t2.network group by cdate(int(t1.dt_sched)),t1.network,t2。網絡' – 2013-02-25 02:36:23