1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQL Serverでスターリンソート

Posted at

流行りが過ぎたところで投稿
二通りの方法が思いついたが、あまり粛清感が無い
DELETE を使用するべきだったかもしれない

/*************************************/
/***          STALIN SORT          ***/
/*************************************/
DECLARE @UNSTALINED AS TABLE(IDX int, SEED int);

--まずはデータを作成
WITH CREATE_SEEDS AS (
    SELECT 0 AS IDX
         , ABS(CAST(CAST(NEWID() AS binary(4)) AS int) % 10 + 1) AS SEED
    UNION ALL
    SELECT CREATE_SEEDS.IDX + 1 AS IDX
         , ABS(CAST(CAST(NEWID() AS binary(4)) AS int) % 10 + 1) AS SEED
    FROM CREATE_SEEDS
    WHERE CREATE_SEEDS.IDX + 1 < 10
)
INSERT INTO @UNSTALINED
SELECT IDX, SEED FROM CREATE_SEEDS;

--データを確認
SELECT IDX, SEED FROM @UNSTALINED ORDER BY IDX;

--Stalin.1
SELECT IDX, SEED
FROM @UNSTALINED AS MAIN
WHERE CASE WHEN
          (SELECT MAX(SEED)
           FROM @UNSTALINED AS SUB
           WHERE MAIN.IDX > SUB.IDX) > SEED
      THEN 0 ELSE 1 END = 1
ORDER BY IDX;

--Stalin.2
DECLARE @STALINED AS TABLE(IDX int, SEED int);

DECLARE STALIN CURSOR FOR SELECT IDX, SEED FROM @UNSTALINED ORDER BY IDX;
OPEN STALIN;

DECLARE @IDX  int;
DECLARE @SEED int;
FETCH NEXT FROM STALIN INTO @IDX, @SEED;

WHILE (@@fetch_status = 0)
BEGIN

    IF @SEED >= (SELECT ISNULL(MAX(SEED), 0) FROM @STALINED)
    BEGIN

        INSERT INTO @STALINED (IDX, SEED) VALUES (@IDX, @SEED);
    END

    FETCH NEXT FROM STALIN INTO @IDX, @SEED;
END

CLOSE STALIN
DEALLOCATE STALIN

SELECT IDX, SEED FROM @STALINED ORDER BY IDX;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?