6

SQL Server 2012 で解決する方法がよくわからない質問について、ガイダンスとヘルプが必要です。LAGLEAD関数が役立つと思いますが、よくわかりません。

これは私のデータが今見えるものです:

=========================================
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を比較することですYearMonth(それを と呼びましょう201406) と以前のものを比較します (それを とYearmonth呼びましょう201405):

例 :

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

基本的に私が理解しようとしているのは、現在の月の行 (201406) と呼ばれる列の前の月の行 (201405) を比較する方法Activeです。

当月の行列Activeがゼロ以外で、前月のアクティブがゼロであった場合、当月の行は「新規」(1) であると結論付けます (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  

どうすればこの問題を解決できますか?

4

2 に答える 2

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 デモ]

于 2015-08-09T13:55:10.810 に答える
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 フィドル

Active が 0 に戻って 2 回目に正になった場合に何が起こるかを示すために、Fiddle でデータ サンプルを拡張しました --- この場合、上記のコードは対応する行を新規として設定しません。

于 2015-08-09T11:21:27.503 に答える