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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top