1. ホーム
  2. データベース
  3. mssql2005

文字列中の最大の部分的インクリメンタルを計算する SQL メソッド

2022-01-20 23:13:59

文字列中の最大の増加部分列を求める

データベース環境 sql server 2005

質問として、文字列 "abcbklmnodfghijkmer" の最大の増加部分列を求めよ。この文字列は少し特殊である。

小文字のa〜zの26文字だけで構成されています。

一般的な考え方は次の通りです。

1. 文字列をカラムに転送して保存し、行番号を生成する

2. インクリメンタルカウンター列(デフォルトは1)を設定し、辞書内の順序がインクリメンタルである場合に、上下の行の文字を比較する。

辞書の順序がインクリメンタルである場合、カウンタは1だけ増加し、そうでない場合は、カウンタに1が設定される

3. 3. カウンターが最大の数字とそれに対応する行番号を見つけ、この2つの数字に従って文字列をインターセプトする。

アイデアはあるので、以下はそのコードです。

DECLARE @vtext VARCHAR(255)
SET @vtext = 'abcbklmnodfghijkmer'
/*Speak string into a column and generate row numbers*/
WITH x0
   AS ( SELECT number AS id ,
      SUBSTRING(@vtext, number, 1) AS letter
    FROM master.dbo.spt_values
    WHERE type = 'P'
      AND number <= LEN(@vtext)
      AND number >= 1
    ),/*implement counter*/
  x1 ( id, letter, clen )
   AS ( SELECT id ,
      letter ,
      1 AS clen
    FROM x0
    WHERE id = 1
    UNION ALL
    SELECT x0.id ,
      x0.letter ,
      CASE WHEN x1.letter <= x0.letter THEN x1.clen + 1
        ELSE 1
      END AS clen
    FROM x0 ,
      x1
    WHERE x0.id = x1.id + 1
    )
 /*intercept string*/
 SELECT SUBSTRING(@vtext, start, sublen) AS max subsequence
 FROM ( SELECT id ,
      clen ,
      MAX(clen) OVER ( ) AS maxclen ,
      id - MAX(clen) OVER ( ) + 1 AS start ,
      MAX(clen) OVER ( ) AS sublen
    FROM x1
   ) t
 WHERE clen = maxclen

見つかった最大部分配列は

以上のアイデアとコードで、啓蒙と参考になれば幸いです。