比较列上当前月份和上个月的行,SQL Server 2012

Comparing current Month and previous Month's rows on a column, SQL Server 2012

我需要一些指导和帮助来解决我不完全确定如何在 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 列显示每个 locationCode 的状态,还有一个 Active 整数表示每个 LocationCode[=27 的质量=]

Objective:

我的 objective 是比较当前 YearMonth(我们称之为 201406)和之前的 Yearmonth(我们称之为它 201405):

一个例子:

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

基本上我想弄清楚的是如何在名为 Active.

的列上将当前月份的行 (201406) 与上个月的行 (201405) 进行比较

如果当前月份的行 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  

我该如何解决这个问题?

您可以像这样使用 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

我已在 Fiddle 中扩展了您的数据示例,以演示如果 Active 返回零并第二次变为正数会发生什么情况 --- 在这种情况下,上面的代码不会将相应的行设置为新行。

我想你可以使用这样的查询:

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]