流行りが過ぎたところで投稿
二通りの方法が思いついたが、あまり粛清感が無い
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;