2015-08-09 33 views
5

我需要一些指導和幫助,我不完全確定如何在SQL Server 2012中解決一個問題。我認爲LAGLEAD函數可能是有用的,但我我不確定。比較當前月份和列上的上個月的行,SQL Server 2012

這是我的數據看起來現在:

========================================= 
YearMonth LocationCode Active  
========================================= 
201405  123    0 
201406  123    2 
201409  211    1 
201410  211    0 
201411  214    0 
201412  214    3 

我們有一個YearMonth欄,顯示的狀態如何看起來像每個locationCodeActive INT表示每個LocationCode

質量目標:

我的目標是比較LocationCode for curr ENT YearMonth(姑且稱之爲201406)和以前Yearmonth(姑且稱之爲201405):

一個例子:

========================================= 
YearMonth LocationCode Active  
========================================= 
201405  123    0 
201406  123    2 

基本上什麼,我想弄清楚是如何比較當月的行( 201406)到名爲Active的列上一個月的行(201405)。

如果當前月份的行Active列不爲零,且上個月的Active爲零,則我們得出當前月份的行爲「New」(1)else(0)。

提供一個例子如下:

================================================== 
YearMonth LocationCode Active New  
=================================================== 
201405  123    0  0 
201406  123    2  1 
201409  211    1  0 
201410  211    0  0 
201411  214    0  0 
201412  214    3  1 

我怎樣才能解決這個問題?

+0

我公司擁有一批在ROW_NUMBER)尋找第一次行活動是零變化(和第二行是非零,但在許多情況下,它並沒有被糾正。由於活動在一個月內可能是1,而其他活動可能不是1,這就是爲什麼我熱衷於當前和上個月的一些比較技術。 – user3197575

回答

2

我認爲你可以使用這樣的查詢:

SELECT *, 
    CASE 
     WHEN Active <> 0 AND 
      ISNULL(LAG(Active) OVER (PARTITION BY LocationCode ORDER BY YearMonth), 0) = 0 THEN 1 
     ELSE 0 
    END As New 
FROM yourTable; 

[SQL Fiddle Demo]

+0

你測試過嗎?看起來應該改變一些條件。 – Bulat

+0

是的,絕對條件應該顛倒) – Bulat

+0

@Bulat Ooops我明白了,謝謝;)。 –

1

你可以ROW_NUMBER() OVER這樣做:

WITH RankedCodesHistory AS (
SELECT 
    YearMonth, 
    LocationCode, 
    Active, 
    ROW_NUMBER() OVER (PARTITION BY LocationCode, CASE WHEN Active > 0 THEN 1 ELSE 0 END 
        ORDER BY LocationCode, YearMonth, Active) rn 
FROM CodesHistory) 
SELECT 
    YearMonth, 
    LocationCode, 
    Active, 
    CASE WHEN Active > 0 AND rn = 1 THEN 1 ELSE 0 END AS New 
FROM RankedCodesHistory 

SQL Fiddle

我在小提琴證明,如果主動回零,併成爲積極的第二次會發生什麼擴展您的數據樣本---在這種情況下,上面的代碼不會將相應的行設置爲新的。

+1

謝謝你的建議。你認爲有什麼方法可以實現這個問題的LAG和LEAD功能嗎?你的解決方案很好,但是我的問題是我將有數百萬行。這就是爲什麼我有興趣比較兩個月,上個月的專欄與本月的記錄。我喜歡你的解決方案,因爲它讓我更深入地瞭解如何用你的策略解決其他問題。謝謝布拉特。 – user3197575

+0

now @ shA.t用正確的條件更新了他的答案,它對你有用嗎? – Bulat

相關問題