2012-02-15 6 views
2

J'ai une table qui doit être triée en fonction de deux colonnes de nombres (appelons-les Colonne X et Colonne Y). Dans chaque ligne, les deux colonnes peuvent avoir des valeurs numériques (dans ce cas, X < = Y), ou l'une des colonnes peut être NULL.SQL: ORDER BY basé sur deux colonnes de valeurs entrelacées

données Exemple:

 X  Y 
    ----- ----- 
... NULL 26 
... 31 NULL 
... 1  7 
... 39 46 
... NULL 36 
... 15 16 
... NULL 14 
... 23 29 

Je voudrais trier ces données afin que les colonnes entrelacer « correctement ». Plus précisément:

1) Si la valeur de X est présente dans les deux rangées, afin basées sur X.

2) Sinon, si la valeur Y est présent dans les deux rangées, sur la base de l'ordre Y.

3) Sinon, comparez la valeur X disponible et la valeur Y disponible.

Le "correct" tri des données d'exemple serait:

 X  Y 
    ----- ----- 
... 1  7 
... NULL 14 
... 15 16 
... NULL 26 
... 23 29 
... 31 NULL 
... NULL 36 
... 39 46 

est-il un moyen simple d'effectuer ce tri, dans une clause ORDER BY?

+1

Où placeriez-vous '... 25 NULL'? –

+0

Il irait entre 23/29 et 31/NULL. La priorité est toujours donnée au tri par la colonne X si la colonne est remplie dans les deux lignes. Pour clarifier: L'objectif est de finir avec les valeurs de chacune des deux colonnes triées par rapport aux autres valeurs de cette colonne. Pour des raisons évidentes, cela est toujours possible sur la colonne X, et il est généralement possible de se "fermer" avec la colonne Y - Considérons 25/27; il faudrait aller après 23/29, même si cela causerait un petit désordre dans la colonne Y. – VeeArr

Répondre

5

Vous ne pouvez pas. L'ordre n'est pas bien définie

Le simple jeu

5 10 
7 null 
null 8 

peuvent être triés

null 8 
5 10 
7 null 

et

5 10 
7 null 
null 8 

selon l'endroit où vous commencez à trier.

Si possible, je changerais le critère de tri en "X si disponible, sinon Y". Ensuite, vous pouvez utiliser l'opérateur COALSECE comme suggéré par "mu is too short". (order by coalesce(x, y))

+1

Ouais, l'ordre final dépend des lignes qui sont comparées avec quelles autres lignes donc ce n'est pas une propriété de l'ensemble dans son ensemble, c'est un artefact du processus de "tri". Bel exemple de contre-exemple. –

+0

J'avais peur que cela puisse être le cas. Pouvez-vous proposer des suggestions pour une manière raisonnable de rendre l'opération de tri transitive? Par exemple, comme vous l'avez démontré, il est possible de choisir plus d'un tri "correct" pour un ensemble de données particulier; l'un ou l'autre est également valide pour mes buts (bien que le premier soit plus dans l'esprit de ce que j'essaie de faire). Existe-t-il un moyen de modifier les "règles de tri" que j'ai définies afin qu'elles donnent la même sortie indépendamment de l'ordre des entrées? – VeeArr

Questions connexes