id value
1 50
2 60
3 55
select max(value) from tablename;
Im Allgemeinen wissen wir, dass wir 60 bekommen werden, aber ich brauche den nächsten Wert 55.
Wie erhalte ich den Wert 55 mit SQL?
quelle
id value
1 50
2 60
3 55
select max(value) from tablename;
Im Allgemeinen wissen wir, dass wir 60 bekommen werden, aber ich brauche den nächsten Wert 55.
Wie erhalte ich den Wert 55 mit SQL?
Um den zweithöchsten eindeutigen Wert in der Tabelle zu erhalten, können Sie verwenden
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);
Eine generische Lösung kann wie folgt aussehen:
;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
Hier können Sie auch den Bereich wie definieren RowNum >= 10 AND RowNum <= 20
. Und es gibt Ihnen 10. bis 20. Zeilen mit allen erforderlichen Spalten.
Sie haben den üblichen Top-Trick wie:
select top 1 *
from (
select top 2 *
from my_table
order by value desc
) t
order by value asc
Oder Sie können CTE auch wie folgt verwenden:
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
Oder, wenn Sie die neueste Version von SQLServer (> = 2012) verwenden, die Verzögerungsfunktion .
SELECT top 1 lag(value, 1,0) OVER (ORDER BY value)
FROM my_table
order by value desc
Ich werde das so machen:
SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
FROM tablename)
Sie können auch die ROW_NUMBER()
Fensterfunktion verwenden. Wenn Sie den 2. Eintrag erhalten möchten, wenn Sie nach Ihrem Zielwert geordnet sind, können Sie Folgendes tun:
SELECT value
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
value
FROM my_table
) d
WHERE RN = 2
Wenn Sie nun den zweithöchsten Wert erhalten möchten und Duplikate haben, möchten Sie möglicherweise nach dem Werteintrag gruppieren, sodass Sie nur eindeutige Werte erhalten.
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
Sie sollten in der Lage sein, diesen Ansatz zu ändern, um a MIN(id)
in die innere Auswahl aufzunehmen, wenn Sie die ID des ersten Datensatzes mit dem zweithöchsten Wert kennen müssen (vorausgesetzt, Sie hatten einen Datensatz mit zwei 60ern und zwei 55ern).
ROW_NUMBER()
mitDENSE_RANK()
- Sie auch alle anderen Spalten kostenlos. Keine Notwendigkeit zu benutzenGROUP BY
.