【SQLServer】SQLで世代番号を振る

SQLで世代番号を振る

久しぶりの登場!Jimです。どうも🖐

 

今年はここ数年で比較すると涼しめの夏でしたね。

ってことで、久しぶりに少し業務で苦労したので記事にします。

SQLで世代番号を振る。。。

よくわからないよね?自分もなんと表現したらいいのかわからなかったので適当なタイトルにしました。

 

簡単に説明すると、下表の『Noが時系列』で『同一製品の中』で『モデルC』が出た後は『世代』を一つ上げるということ。

この世代部分をSQLで計算する。(本来はNoと製品とモデルのみしかないものとする)

No 製品 モデル 世代
1 メモリ A 1
2 メモリ B 1
3 メモリ B 1
4 メモリ C 1
5 メモリ A 2
6 メモリ B 2
7 メモリ C 2
8 メモリ A 3
9 メモリ C 3
10 モニタ A 1
11 モニタ B 1

 

なので、モニタは製品が違うので4世代にはならなずに1世代になる。

この『世代』部分をSQLで出力するってこと。。

SELECT
    [No] 
    , 製品 
    , モデル 
    , 1 + COALESCE(
         SUM(CASE WHEN モデル = 'C' THEN 1 ELSE 0 END)  --④
             OVER (
                 PARTITION BY 製品  --①
                 ORDER BY [No]      --②
                 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING  --③
             ),
         0
     ) AS 世代
 FROM table ORDER BY [No];

何をやってんのかっていうと、同一製品内のレコードを[No]順でみていって、自レコードの一つ前までモデルCがあった場合に1をSumしていくということ。

①同一製品内(グループ分け)

②Noの時系列(ソート)

③『①』の中で自レコードより1つ前までの

④モデルCがあった場合1をSUMする

という感じの、また何処かで使えるかもしれないSQLを書きましたよって話。

簡単に説明すると同一製品内のモデルCでカウントアップしてるだけだね。

 

ちな、『1 PRECEDING』は自レコードより1つ前なんだけど、自レコードは『CURRENT ROW』で自レコードより1つ後が『1 FOLLOWING』になります。

 

 

 

はい、すんごい単純なことだったんだけど、また使いそうなのでブログにしました。

ってことで、またね🖐