2014-02-28 89 views
0

該數據集包含不同公司的每日(營業日)時間序列。還有一個指標變量(ind)取值爲1或0.如果給定公司的ind爲1,那麼我想要在指標事件之前的某個時間範圍內構建數據集的子樣本,包括該公司的所有條目。根據當前行的條件選擇以前的行

我們可以把下面的示例數據:

day    company ind   
    2012-01-11  A   0    
    2012-01-11  B   0    
    2012-01-11  C   0    
    2012-01-12  A   0    
    2012-01-12  B   0    
    2012-01-12  C   0    
    2012-01-13  A   0    
    2012-01-13  B   1    
    2012-01-13  C   0    
    2012-01-16  A   0    
    2012-01-16  B   0    
    2012-01-16  C   0    
    2012-01-17  A   1    
    2012-01-17  B   0    
    2012-01-17  C   0    
    2012-01-18  A   0    
    2012-01-18  B   1    
    2012-01-18  C   0 

我的目標是包括其各自的事件之前指示器事件公司A和B的時間範圍(-2天-1天)一個子樣本(確保在此時間範圍內,各公司不存在其他事件)。這將是我想要的結果:

day    company ind   
    2012-01-11  B   0    
    2012-01-12  B   0    
    2012-01-13  A   0    
    2012-01-13  B   0    
    2012-01-16  A   0    
    2012-01-16  B   0    
    2012-01-17  B   0 

下面的代碼工作,如果在數據集中只有一個公司只有一個指標事件:

CREATE TABLE temp AS 
    SELECT Row_Number() OVER (PARTITION BY company ORDER BY day) AS rowid, * 
    FROM mytable 

    CREATE TABLE window AS SELECT * 
         FROM temp t1 
         WHERE company IN (
             SELECT company 
             FROM temp t2 
             WHERE t2.ind = 1) 
         AND rowid BETWEEN((SELECT rowid FROM temp where ind = 1) - 2) 
            AND ((SELECT rowid FROM temp where ind = 1) -1) 

但是我真的在努力程度上它例如數據集中有多個事件公司,並且每個公司可能有多個事件。

你有什麼想法如何解決這個問題?

+0

似乎最簡單的用'LEAD()'功能,它允許你這樣做評估當前行的「行前」行中的數據。 –

+0

感謝您的建議。在我的代碼中,哪裏可以使用LEAD()函數? @GoatCO – user3319629

回答

3

既然你通過公司在試圖分割我假設你真的不希望在搜索結果的下面一行:

2012-01-13  B   0 

如果是這樣的話,你可以使用LEAD()看提前1個或2行以查看是否填充ind標誌:

WITH cte AS (SELECT * ,LEAD(ind) OVER(PARTITION BY company ORDER BY day) AS Lead1 
         ,LEAD(ind,2) OVER(PARTITION BY company ORDER BY day) AS Lead2 
      FROM Table1) 
SELECT Day,Company,Ind 
FROM cte 
WHERE Lead1 = 1 
    OR Lead2 = 1 
ORDER BY day,company 

演示:SQL Fiddle

更新:給定一個較大的ř安格,這種方式是更好,因爲你可以指定你想要多少行提前看(演示更新,包括兩者):

WITH cte AS (SELECT * 
        , MAX(ind) OVER(PARTITION BY company ORDER BY day ROWS BETWEEN 1 following AND 2 following) Lead1 
      FROM Table1) 
SELECT Day,Company,Ind 
FROM cte 
WHERE Lead1 = 1 
ORDER BY day,company 
+0

非常感謝,它的工作完美!你知道如何避免輸入LEAD(ind,1),LEAD(ind,2),...,LEAD(ind,30)嗎?我實際需要的窗口比2天大得多,但我不想發佈如此長的時間系列。 @GoatCO – user3319629

+0

@ user3319629查看更新,您可以在MAX()函數中創建一個窗口,查看是否在下一個「n」行中填充了任何ind標誌。只需更新'2跟隨'爲'30跟隨'或其他。 –

+0

太棒了!再次感謝,現在對我的目標更好! @GoatCO – user3319629

相關問題