SQL MAX della colonna inclusa la sua chiave primaria
-
03-07-2019 - |
Domanda
Breve:
Da sotto sql selezionare Ottengo cart_id e il valore dell'articolo massimo stimato in quel carrello.
SELECT CartItems.cart_id, MAX(ItemValues.value)
FROM CartItems
INNER JOIN ItemValues
ON CartItems.item_id=ItemValues.item_id
GROUP BY CartItems.cart_id
ma ho anche bisogno di item_id per quell'articolo (ItemValues.item-id).
Long:
Due tabelle, CartItems, ItemValues ??(e i rispettivi Carrelli, Articoli, qui non pertinenti).
Ogni carrello può avere diversi articoli in cui ogni articolo ha un valore definito in ItemValues.
Ogni articolo appartiene a un carrello.
Il valore di un carrello è il valore dell'articolo con il valore massimo all'interno del carrello.
Come faccio a selezionare id-carrello, max (valore-articolo) e il suo ID-articolo corrispondente?
Ad esempio cart-id A contiene l'id-elemento X con valore 10 e l'id-elemento Y con valore 90.
Con sql sopra selezionare Ottengo,
A, 90Quello di cui ho bisogno è
A, Y, 90
piattaforma: MS SQL
Soluzione
In MS SQL
e 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
In 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
Altri suggerimenti
Questo codice è stato scritto per Oracle, ma dovrebbe essere compatibile con la maggior parte delle versioni SQL:
Questo ottiene il massimo (high_val) e restituisce la sua chiave.
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
Ciò che dice è: ordina mytable per high_val decrescente per valori in cui qualcosa = 'valanga'. Prendi solo la riga superiore, che ti fornirà il massimo (valore_alta) nell'intervallo selezionato e il_chiave_di quella tabella.