比较列上当前月份和上个月的行,SQL Server 2012
Comparing current Month and previous Month's rows on a column, SQL Server 2012
我需要一些指导和帮助来解决我不完全确定如何在 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
[=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
我已在 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 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
[=27 的质量=]
Objective:
我的 objective 是比较当前 YearMonth
(我们称之为 201406
)和之前的 Yearmonth
(我们称之为它 201405
):
一个例子:
=========================================
YearMonth LocationCode Active
=========================================
201405 123 0
201406 123 2
基本上我想弄清楚的是如何在名为 Active
.
如果当前月份的行 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
我已在 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;