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?
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?
Antworten:
Unter der Annahme, dass der höchste Wert nur einmal vorkommt, ist eine andere Möglichkeit die Verwendung OFFSET
(SQL Server 2012 oder höher):
SELECT *
FROM tablename
ORDER BY column DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
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
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
.