/ / Pobierz listę wolnych numerów między X i Y Po okręgu - sql-server, tsql

Uzyskaj listę darmowych numerów między X i Y W kółko - sql-server, tsql

Mam tabelę z numerami od 1000 do 9999.

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

The IsFree ustawione na true.

Pierwszego dnia użytkownik może wybrać liczbę wierszy, na przykład 300, Pierwsze 300 z przedziału od 1 do 300 będzie miało wartość false, a użytkownik otrzyma wszystkie wiersze z przedziału 301-9999.

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

W drugim dniu użytkownik może wybrać 400, więc chcę, aby wiersze od 301 do 700 miały wartość false, a użytkownik otrzyma wiersze od 701 do 9999.

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

pierwsze 300 może obstawić ustawione na wartość true, ale nie jest to konieczne.

Chodzi mi o to, że każdego dnia maksymalny indeks wiersza, który ma wartość true + 1, będzie pierwszym wierszem do aktualizacji false + liczba wierszy wybranych przez użytkownika.

Mój problem zaczyna się, gdy docieram do końcatabela, na przykład maksymalny indeks wiersza z wartością true to 9990, a użytkownik wybierze 100, wiersz 9991-9999 powinien mieć wartość false, a wszystkie wiersze, które mają wartość true od 1 do 90, zostaną ustawione na false. Problem w tym, jak ustawić następny dzień, jak znaleźć wiersz 91 jest pierwszym wierszem do aktualizacji?

Odpowiedzi:

0 dla odpowiedzi № 1

kiedy indeks znajduje się „za” początkiem, możesz użyć „indeksu hipotetycznego”, jeśli indeks + 10000, aby ustawić go na końcu sekwencji

    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 ;