id value
1 50
2 60
3 55
select max(value) from tablename;
Generalmente sappiamo che ne otterremo 60, ma ho bisogno del prossimo valore 55.
Come ottengo il valore 55 usando SQL?
id value
1 50
2 60
3 55
select max(value) from tablename;
Generalmente sappiamo che ne otterremo 60, ma ho bisogno del prossimo valore 55.
Come ottengo il valore 55 usando SQL?
Risposte:
Supponendo che il valore più alto si verifichi solo una volta, un altro modo sarebbe utilizzare OFFSET
(SQL Server 2012 o successivo):
SELECT *
FROM tablename
ORDER BY column DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
Per ottenere il secondo valore distinto più alto nella tabella è possibile utilizzare
SELECT MIN(value)
FROM (SELECT DISTINCT TOP (2) value
FROM tablename
ORDER BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);
Una soluzione generica può essere come di seguito:
;WITH CTE AS
(
SELECT
Col1
, Col2
, <AnyColumns>
, ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
FROM <YourTable>
WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem
Qui puoi anche definire l'intervallo come RowNum >= 10 AND RowNum <= 20
. E ti darà dalla 10a alla 20a fila con tutte le colonne richieste.
Hai il solito trucco principale come:
select top 1 *
from (
select top 2 *
from my_table
order by value desc
) t
order by value asc
Oppure puoi anche usare CTE come:
with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2
In alternativa, se si utilizza la versione recente di SQL Server (> = 2012), la funzione di ritardo .
SELECT top 1 lag(value, 1,0) OVER (ORDER BY value)
FROM my_table
order by value desc
Puoi anche usare la ROW_NUMBER()
funzione di finestre. Se si desidera ottenere la seconda voce quando viene ordinato in base al valore target, è possibile effettuare:
SELECT value
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
value
FROM my_table
) d
WHERE RN = 2
Ora se vuoi ottenere il 2 ° valore più alto e hai duplicati, potresti voler raggruppare in base alla voce del valore in modo da ottenere solo valori distinti.
SELECT value
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
value
FROM my_table
GROUP BY value
) d
WHERE RN = 2
Dovresti essere in grado di modificare questo approccio per includere a MIN(id)
nella selezione interna se devi conoscere l'ID del primo record con il 2 ° valore più alto (supponendo che tu avessi un set di dati con due 60 e due 55)
ROW_NUMBER()
conDENSE_RANK()
: ottieni anche tutte le altre colonne gratuitamente. Non c'è bisogno di usareGROUP BY
.