Oracle des fonctions Analytiques - Comment réutiliser une PARTITION PAR la clause?
J'ai écrit un complexe de requête SQL avec Oracle dans lequel je veux utiliser deux analytique de la fonction au cours de la même partition.
Soyons assez simple mais pas trop:
SELECT col1,
MAX(col2) OVER(PARTITION BY col3, col4, col5, col6,
CASE WHEN col7 LIKE 'foo'
THEN SUBSTR(col7,1,5)
ELSE col7
END
ORDER BY col5 ASC, col6 DESC),
MIN(col2) OVER(PARTITION BY col3, col4, col5, col6,
CASE WHEN col7 LIKE 'foo'
THEN SUBSTR(col7,1,5)
ELSE col7
END
ORDER BY col5 ASC, col6 DESC)
FROM my_table;
Est-il plus élégant de la syntaxe à l'affacturage les PARTITION BY
clause?
Merci.
Considérant que les fonctions que vous utilisez sont
Vous avez raison, mais ceci a été conçu comme un simple exemple, il pourrait être LAST_VALUE ou de tout autre analytique.
double possible de l'Application de Plusieurs Fonctions de la Fenêtre Sur la Même Partition. Ce double n'a pas été facile à trouver.
MAX
et MIN
et aussi col5
et col6
sont dans le partition
et la order by
, le order by
clause pour chaque colonne semble être redondant.Vous avez raison, mais ceci a été conçu comme un simple exemple, il pourrait être LAST_VALUE ou de tout autre analytique.
double possible de l'Application de Plusieurs Fonctions de la Fenêtre Sur la Même Partition. Ce double n'a pas été facile à trouver.
OriginalL'auteur Benoit | 2011-03-29
Vous devez vous connecter pour publier un commentaire.
Si vous faites référence à la FENÊTRE standard clause de ce genre:
alors je crois que la réponse est pas, Oracle ne prend pas en charge cette (vérifié avec 11gR2).
mais malheureusement, il n' pas travailler dans Oracle!
Je viens de remarquer que d'essayer de l'utiliser. Si mauvais.
Intéressant! Je ne savais pas que cela faisait partie du SQL:2008 standard. J'ai vérifié, il est défini en
7.4 <table expression>
. Nice. Jusqu'à présent, j'ai seulement observé que cette clause puisse être mis en œuvre dans Postgres...OriginalL'auteur a_horse_with_no_name
Vous pouvez utiliser une sous-requête d'affacturage, aussi connu comme la avec la clause:
(non testé)
Ce qui concerne,
Rob.
WITH
qui est un grand mot clé dans Oracle.Vous pouvez raccourcir la clause "select t.*, [expression] comme new_col7 from mytable t" et l'utilisation new_col7 dans la requête.
Pourtant, il ne sera pas vraiment s'attaquer à la racine du problème: dans votre code, vous répétez encore la
(partition by ...)
partie!Vrai. Bien que l'on pourrait discuter pour savoir si c'est pour être classé comme un problème.
À mon avis, tout ce qui rend le code moins lisible ou moins compréhensible est un problème.
OriginalL'auteur Rob van Wijk