SQL MAX de colonne incluant sa clé primaire
-
03-07-2019 - |
Question
Court:
Ci-dessous, sql select, j'obtiens le identifiant_cartier et la valeur de l'élément à valeur maximale dans ce panier.
SELECT CartItems.cart_id, MAX(ItemValues.value)
FROM CartItems
INNER JOIN ItemValues
ON CartItems.item_id=ItemValues.item_id
GROUP BY CartItems.cart_id
mais j'ai aussi besoin de item_id pour cet élément (ItemValues.item-id).
Long:
Deux tables, CartItems, ItemValues ??(et leurs paniers, éléments, non pertinents ici).
Chaque panier peut avoir plusieurs éléments, chaque élément ayant une valeur définie dans ItemValues.
Chaque article appartient à un panier.
La valeur d'un panier est la valeur de l'article avec une valeur maximale dans son panier.
Comment sélectionner cart-id, max (item-value) et son item correspondant?
Par exemple, cart-id A contient l'ID d'article X avec la valeur 10 et l'ID d'article Y avec la valeur 90.
Avec ci-dessus sql sélectionnez je reçois,
A, 90Ce dont j'ai besoin, c'est
A, Y, 90
plate-forme: MS SQL
La solution
Dans MS SQL
et Oracle
:
SELECT *
FROM
(
SELECT ci.*, iv.*,
ROW_NUMBER() OVER (PARTITION BY CartItems.cart_id ORDER BY ItemValues.value DESC)
FROM CartItems ci
INNER JOIN ItemValues iv
ON CartItems.item_id=ItemValues.item_id
) s
WHERE rn = 1
Dans MySQL
:
SELECT
FROM
(
SELECT ci.*,
(
SELECT id
FROM ItemValues iv
WHERE iv.item_id = ci.item_id
ORDER BY
value DESC
LIMIT 1
) AS maxitem
FROM CartItems ci
) iv, ItemValues ivo
WHERE ivo.id = iv.maxitem
Autres conseils
Ce code a été écrit pour Oracle, mais devrait être compatible avec la plupart des versions SQL:
Ceci obtient le max (high_val) et retourne sa clé.
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
Ceci dit: Triez mytable par high_val décroissant pour des valeurs où quelque chose = 'valeur'. Saisissez uniquement la ligne du haut, ce qui vous fournira le max (high_val) de la plage sélectionnée et la my_key de cette table.