6

对于一个我不完全确定如何在 SQL Server 2012 中解决的问题,我需要一些指导和帮助。我认为LAG函数LEAD可能有用,但我不确定。

这是我的数据现在的样子:

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

我们有一YearMonth列显示每个状态的状态locationCode和一个Active表示每个质量的 intLocationCode

客观的:

我的目标是比较LocationCode当前YearMonth(我们称之为201406)和前一个Yearmonth(我们称之为201405)的 for:

一个例子 :

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

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

如果当前月份的行列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 小提琴演示]

于 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小提琴

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

于 2015-08-09T11:21:27.503 回答