serveur sql - Combinez des identifiants uniques dans une plage
-
28-10-2019 - |
Question
J'ai une table qui contient beaucoup d'entiers.Cette table est interrogée et les résultats finissent par être convertis en xml.Si le tableau contient par exemple les éléments suivants:
SELECT itemId FROM items WHERE enabled = true
1
2
3
5
Ma sortie xml finale après quelques traitements serait:
<item id="1" />
<item id="2" />
<item id="3" />
<item id="5" />
Le xml finit par être assez volumineux et de nombreux éléments sont en fait des plages.Ce que je voudrais faire, c'est mettre à jour ma requête pour combiner des plages (beaucoup de ces éléments sont des `` voisins '', donc le XML généré serait un peu plus petit).J'essaie de faire en sorte que les résultats des procédures ressemblent davantage à ceci:
1-3
5
Pour que le XML final ressemble à quelque chose comme ça (si je peux simplement changer la procédure, le traitement XML peut rester le même):
<item id="1-3"/>
<item id="5"/>
Je pensais que mon meilleur moyen serait peut-être d'utiliser une auto-jointure où table1.itemId = table2.itemId - 1
mais je n'ai pas pu le faire fonctionner.Quelqu'un a-t-il des suggestions sur la manière de procéder?
La solution
Cela vous aiderait-il?
SELECT
MIN(ItemID)
,MAX(ItemID)
FROM
(
SELECT ItemID, RANK() OVER (ORDER BY ItemID) R FROM Items
) Tmp
GROUP BY
ItemID - R
Autres conseils
Je pense que cela devrait faire l'affaire: 1) order by itemID 2) utiliser OVER ... PARTITION pour obtenir le numéro de ligne 3) l'utiliser dans une expression de table commune récursive qui joint un nombre à tous les autres où ancre +numéro de ligne est égal à ItemID, trouvant ainsi tous les numéros séquentiels 4) groupés par l'ancre dans une requête externe, puis utilisez MIN et MAX pour obtenir la plage.