Dans SQL Server 2005, compte tenu de l'ensemble de résultats suivantnombre Soustraction de lignes en sous-requête de requête en cours
ID | InstanceNumber | IsArchived
5000 | 1 | True
8347 | 2 | True
9343 | 3 | False
11048 | 4 | False
Ce que je voudrais revenir est la suivante:
ID | InstanceNumber | IsArchived
9343 | 1 | False
11048 | 2 | False
où les lignes avec « IsArchived "false est renvoyé, mais en soustrayant la colonne Max InstanceNumber du resultset.
Voici un exemple instruction SQL qui retourne le comportement que je suis à la recherche:
DECLARE @tbl TABLE
(ID INT NOT NULL, InstanceNumber INT NOT NULL, IsArchived BIT NOT NULL)
INSERT INTO @tbl VALUES (5000, 1, 1)
INSERT INTO @tbl VALUES (8347, 2, 1)
INSERT INTO @tbl VALUES (9343, 3, 0)
INSERT INTO @tbl VALUES (11048, 4, 0)
SELECT ID, InstanceNumber - (SELECT MAX(InstanceNumber) FROM @tbl WHERE IsArchived = 1), IsArchived
FROM @tbl
WHERE IsArchived = 0
Est-ce la façon la plus efficace de le faire ou est-il une autre façon qui peut être atteint ce même comportement? J'ai des clauses where supplémentaires qui doivent aller dans la déclaration complète (comme 5-6 déclarations) et je veux éviter d'avoir à les déclarer 2X, une fois pour retourner l'instance max qui est archivée, et pour le filtrage du jeu de résultats. Pour clarifier l'exigence de la requête, la colonne "InstanceNumber" pourrait ignorer les nombres. donc il pourrait y avoir un enregistrement pour InstanceNumber = 6 sans en retourner un pour 5, donc tous les enregistrements retournés ne seront pas séquentiels.
Heureusement, il ne devrait pas y avoir d'espace dans l'archive de manière séquentielle. Les chiffres les plus bas seront toujours les enregistrements archivés potentiels. J'ai oublié de mentionner une chose avec les enregistrements est qu'il pourrait y avoir une rupture dans le "numéro d'instance" qui est retourné. –
Donc, ma solution ne fonctionnera pas car elle ne va pas préserver les lacunes? – ErikE