我需要一些指导并帮助解决一个问题我不完全确定如何在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
的质量的LocationCode
int
目的:
我的目标是比较当前LocationCode
(我们称之为YearMonth
)和之前201406
的{{1}}(让我们称之为Yearmonth
):
一个例子:
201405
基本上我想弄清楚的是如何将当前月份的行(201406)与上一个月的行(201405)进行比较,名为=========================================
YearMonth LocationCode Active
=========================================
201405 123 0
201406 123 2
。
如果当前月份的行Active
列为非零且前一个月的活动为零,则我们将当前月份的行结束为“新”(1)否则为(0)。
下面提供了一个例子:
Active
我该如何解决这个问题?
答案 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;
答案 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
我已经在小提琴中扩展了你的数据样本,以演示如果Active回到零并且第二次变为正数会发生什么 - 在这种情况下,上面的代码不会将相应的行设置为新的。