我需要一些指导并帮助解决SQL SERVER 2012中的数据操作问题。
这就是我的数据:
=================================================
YearMonth LocationCode New ValidTo
=================================================
201412 2020 1 201502
201501 2020 1 201503
201503 3030 1 201506
201506 3030 1 201509
问题描述
如果查看上表,您会看到列YearMonth
,locationCode
,New
,它会告诉locationCode
是否为该行中的新月。 ValidTo列显示其有效的ValidTo
YearMonth
。
例如,对于YearMonth
201412,locationCode
2020是1,这意味着New
,LocationCode
被认为是新的ValidTo
201502。
我的问题是我需要将出现在最早的YearMonth列中的每个LocationCode设置为New,就是这种情况" 1"直到ValidTo YearMonth。
目的:
=================================================
YearMonth LocationCode New ValidTo
=================================================
201412 2020 1 201502
201501 2020 1 201503
201503 3030 1 201506
201506 3030 0 201509
基本上,我需要找出每个MIN()
的{{1}},然后将其归类为LocationCode
," 1"如果NEW
出现在MIN()LocationCode
和YearMonth
中,则将ValidTo
中的LocationCode
归类为&#34; 1&#34;。< / p>
我该怎么做?上表提供了一个可视化示例。
我已经编辑了我的决赛桌,以便更容易理解我的问题。
基本上,New
3030的MIN() Year
为201503,而LocationCode
在LocationCode
列中显示为201506之前有效。如果Validto
3030出现在LocationCode
行,201505,YearMonth
到201506,那么我们也会将其归类为VALIDTO
(1)。
基本上,伪代码
New
如果SELECT
MIN(YearMonth),
LocationCode
from Tabl
在MIN(YearMonth)和LocationCode
时间段内,则将其归类为1.我该怎么做?
答案 0 :(得分:0)
请尝试以下查询来更新表格:
最内层查询计算每Yearmonth
的最小LocationCode
,用于计算ValidTo
列中需要更新为1的所有LocationCode
和ValidTo
update t2
set New= CASE when t1.ValidTo is null then 0 else 1 end
FROM tbl t2
LEFT JOIN
(
select t.ValidTo, t.locationCode
from tbl t inner join
(
select
MIN(YearMonth) as MYM,
LocationCode
from tbl
group by LocationCode
) g
on t.YearMonth=g.MYM and t.LocationCode=g.LocationCode
) t1
on t2.ValidTo=t1.ValidTo and t2.LocationCode=t1.LocationCode
示例sql小提琴演示: http://sqlfiddle.com/#!6/229d8