/ / Obtenir la liste des nombres libres entre X et Y De manière circulaire - sql-server, tsql

Obtenir la liste des nombres libres entre X et Y De manière circulaire - sql-server, tsql

J'ai une table avec des nombres entre 1000 et 9999.

DECLARE @TempTable Table(index int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0

le IsFree mis à true.

Le premier jour, un utilisateur peut sélectionner le nombre de lignes, par exemple 300, Les 300 premiers de 1 à 300 seront définis sur false et l'utilisateur obtiendra toutes les lignes entre 301 et 9999.

UPDATE @TempTable
SET IsFree=0
WHERE index>=@Max
AND index < @Max+@Rows

Le deuxième jour, l'utilisateur peut sélectionner 400. Je veux donc que les lignes 301 à 700 soient définies sur false et que l'utilisateur obtienne les lignes 701 à 9999.

SELECT TOP 1 @Max=index
FROM @TempTable
WHERE IsFree=0
ORDER BY index

les 300 premiers peuvent parier sur true mais pas nécessaire.

Je veux dire que chaque jour, l'index de lignes maximum ayant la valeur true + 1 sera la première ligne à mettre à jour false + le nombre de lignes sélectionnées par l'utilisateur.

Mon problème commence quand j'atteins la fin dutable, par exemple, l'index de ligne maximum avec true est 9990 et l'utilisateur sélectionne 100; la ligne 9991-9999 doit être définie sur false et toutes les lignes ayant une valeur de true de 1 à 90 seront définies sur false. le problème est de savoir comment définir le lendemain, comment trouver que la ligne 91 est la première ligne à mettre à jour?

Réponses:

0 pour la réponse № 1

quand l'index est "derrière" le début, vous pouvez utiliser un "index théorique" si index + 10000 pour lui ordonner de suivre la fin de la séquence

    DECLARE @TempTable Table([index] int,IsFree bit)
DECLARE @Max int,@Rows int
SET @Max=0

DECLARE @I int = 0;

WHILE @I <= 10000
BEGIN
INSERT @TempTable VALUES(@I, "true");
SET @I = @I + 1;
END

SET @MAX = 9900;
SET @ROWS  =1000;

--rows selected
WITH FREE AS (SELECT [index],
IsFree,
CASE WHEN [index] < @MAX THEN  [index] + 10000 ELSE [index] END as NotionalRow
FROM @TempTable)
SELECT * FROM FREE WHERE NotionalRow>=@Max
AND NotionalRow < @Max+@Rows ORDER BY NotionalRow;


--you can update over a WITH statement
WITH FREE AS (SELECT [index],
IsFree,
CASE WHEN [index] < @MAX THEN  [index] + 10000 ELSE [index] END as NotionalRow
FROM @TempTable)
UPDATE FREE SET IsFree = "false" WHERE NotionalRow>=@Max
AND NotionalRow < @Max+@Rows ;