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

时间:2015-08-09 10:42:42

标签: sql sql-server-2012 lead

我需要一些指导并帮助解决一个问题我不完全确定如何在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 int

目的:

我的目标是比较当前LocationCode(我们称之为YearMonth)和之前201406的{​​{1}}(让我们称之为Yearmonth ):

一个例子:

201405

基本上我想弄清楚的是如何将当前月份的行(201406)与上一个月的行(201405)进行比较,名为========================================= YearMonth LocationCode Active ========================================= 201405 123 0 201406 123 2

如果当前月份的行Active列为非零且前一个月的活动为零,则我们将当前月份的行结束为“新”(1)否则为(0)。

下面提供了一个例子:

Active

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

我已经在小提琴中扩展了你的数据样本,以演示如果Active回到零并且第二次变为正数会发生什么 - 在这种情况下,上面的代码不会将相应的行设置为新的。