数据操作Row_Number()SQL SERVER

时间:2015-08-11 13:06:09

标签: sql sql-server sql-server-2012

我需要一些指导并帮助解决SQL SERVER 2012中的数据操作问题。

这就是我的数据:

=================================================
YearMonth LocationCode  New     ValidTo
=================================================
201412         2020     1       201502
201501        2020      1       201503
201503        3030      1       201506
201506        3030      1       201509

问题描述

如果查看上表,您会看到列YearMonthlocationCodeNew,它会告诉locationCode是否为该行中的新月。 ValidTo列显示其有效的ValidTo YearMonth

例如,对于YearMonth 201412,locationCode 2020是1,这意味着NewLocationCode被认为是新的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,&#34; 1&#34;如果NEW出现在MIN()LocationCodeYearMonth中,则将ValidTo中的LocationCode归类为&#34; 1&#34;。< / p>

我该怎么做?上表提供了一个可视化示例。

我已经编辑了我的决赛桌,以便更容易理解我的问题。

基本上,New 3030的MIN() Year为201503,而LocationCodeLocationCode列中显示为201506之前有效。如果Validto 3030出现在LocationCode行,201505,YearMonth到201506,那么我们也会将其归类为VALIDTO(1)。

基本上,伪代码

New

如果SELECT MIN(YearMonth), LocationCode from Tabl 在MIN(YearMonth)和LocationCode时间段内,则将其归类为1.我该怎么做?

1 个答案:

答案 0 :(得分:0)

请尝试以下查询来更新表格: 最内层查询计算每Yearmonth的最小LocationCode,用于计算ValidTo列中需要更新为1的所有LocationCodeValidTo

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