it-swarm-eu.dev

Abfrage zum Ermitteln des n-ten Maximalwerts einer Spalte

Ich möchte den 2., 3...nth maximalen Wert einer Spalte ermitteln

24

Sie können die Spalte in absteigendes Format sortieren und dann einfach den Wert aus der n-ten Zeile erhalten.

BEARBEITEN::

Aktualisiert wie pro Kommentaranfrage.WARNUNGkomplett ungeprüft!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6

So etwas sollte für Oracle funktionieren. Möglicherweise müssen Sie zuerst die Syntax richtig einstellen!

11
TK.

Betrachten Sie die folgende Employee-Tabelle mit einer einzelnen Spalte für das Gehalt.

 + ------ + 
 | Sal | 
 + ------ + 
 | 3500 | 
 | 2500 | 
 | 2500 | 
 | 5500 | 
 | 7500 | 
 + ------ + 

Die folgende Abfrage gibt das N-te Maximum-Element zurück.

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )

Für zB wenn der zweite Maximalwert erforderlich ist,

  select SAL from EMPLOYEE E1 where 
     (2 - 1) = (select count(distinct(SAL)) 
                from EMPLOYEE E2 
                where E2.SAL > E1.SAL )
 + ------ + 
 | Sal | 
 + ------ + 
 | 5500 | 
 + ------ + 
28
dexter

Sie haben nicht angegeben, welche Datenbank Sie in MySQL verwenden können

SELECT column FROM table ORDER BY column DESC LIMIT 7,10;

Überspringe die ersten 7 und bekomme dann die nächsten zehn höchsten.

7
Pieter

Möglicherweise müssen Sie möglicherweise eine Korrektur für Ihre Datenbank vornehmen. Wenn Sie jedoch den obersten 2. Wert in einem Dataset mit potenziell doppeltem Wert wünschen, müssen Sie auch eine Gruppe erstellen:

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2;

Überspringe die ersten beiden und bekomme dann die nächsten fünf höchsten. 

5

Pure SQL (Hinweis: Ich würde die Verwendung von SQL-Funktionen für Ihr DBMS empfehlen, da diese wahrscheinlich effizienter sind). Damit erhalten Sie den n + 1 größten Wert (um den kleinsten Wert zu erhalten, drücken Sie <). Wenn Du Duplikate hast, mache es COUNT (DISTINCT VALUE).

select id from table order by id desc limit 4 ;
+------+
| id   |
+------+
| 2211 | 
| 2210 | 
| 2209 | 
| 2208 | 
+------+


SELECT yourvalue
  FROM yourtable t1
 WHERE EXISTS( SELECT COUNT(*)
                 FROM yourtable t2
                WHERE t1.id       <> t2.id
                  AND t1.yourvalue < t2.yourvalue
               HAVING COUNT(*) = 3 )


+------+
| id   |
+------+
| 2208 | 
+------+
4
Matt Rogish

(Tabellenname = Student, Spaltenname = Markierung)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
3
German Alex

Sie können den n-ten größten Wert der Spalte mithilfe der folgenden Abfrage ermitteln:

SELECT * FROM TableName a WHERE
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName);
2
Select max(sal) 
from table t1 
where N (select max(sal) 
        from table t2 
        where t2.sal > t1.sal)

Um den N-ten max sal zu finden.

1
Piyush
select column_name from table_name 
order by column_name desc limit n-1,1;

wobei n = 1, 2, 3, ... n. maximaler Wert.

1
rashedcs

Hier ist eine Methode für Oracle. Dieses Beispiel erhält den 9. höchsten Wert. Ersetzen Sie einfach die 9 durch eine Bind-Variable, die die Position enthält, nach der Sie suchen.

   select created from (
     select created from (
       select created from user_objects
         order by created desc
       )
       where rownum <= 9
       order by created asc
     )
     where rownum = 1

Wenn Sie den n-ten eindeutigen Wert wünschen, würden Sie DISTINCT im innersten Abfrageblock hinzufügen.

1
Dave Costa

Dies ist eine Abfrage zum Erhalten des n-ten Höchsten aus der Spalte put n = 0 für den zweithöchsten und n = 1 für den 3. höchsten und so weiter ...

 SELECT * FROM TableName
 WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1
1
shankar

MySQL:

select distinct(salary) from employee order by salary desc limit (n-1), 1;
0
Ritesh

(TableName = Student, ColumnName = Mark):

select *
from student 
where mark=(select mark 
            from(select row_number() over (order by mark desc) as t,
                 mark 
                 from student group by mark) as td 
            where t=2)
0
German Alex

Ich denke, dass die unten stehende Abfrage auf Oracle SQL perfekt funktioniert ... Ich habe es selbst getestet.

Info zu dieser Abfrage: Diese Abfrage verwendet zwei Tabellen mit den Namen employee und department, wobei die Spalten des Mitarbeiters benannt werden: name (Name des Mitarbeiters), dept_id (gemeinsam für Mitarbeiter und Abteilung), salary.

Und Spalten in der Abteilungstabelle: dept_id (häufig auch für Mitarbeitertabelle), dept_name

SELECT
  tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY  d.dept_name          ORDER BY e.salary)  AS   rank FROM department d JOIN employee e USING (dept_id) )  tab
 WHERE
   rank  BETWEEN 1 AND 2
 GROUP BY
   tab.dept_name

vielen Dank

0
ria

Lösung zum Ermitteln des N-ten Maximalwerts einer bestimmten Spalte in SQL Server:

Mitarbeiter-Tabelle:

Employee Table

Verkaufstabelle:

Sales Table

Mitarbeiter-Tabellendaten:

==========
Id  name
=========
6   ARSHAD M
7   Manu
8   Shaji

Verkaufstabellendaten:

=================
id  emp_id   amount
=================
1   6        500
2   7        100
3   8        100
4   6        150
5   7        130
6   7        130
7   7        330

Abfrage, um Details eines Angestellten herauszufinden, der den höchsten Verkauf aufweist/Nth der höchste Verkäufer

select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );

In WHERE (0) ersetzen Sie 0 durch n-1

Ergebnis:

========================
id  name    total_amount
========================
7   Manu    690
0
ARSHAD M

Sie können das so vereinfachen 

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)

Wenn der Sal doppelte Werte enthält, verwenden Sie diese

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)

der 4. Wert ist der n-te Wert, es kann ein Höchstwert wie 5 oder 6 usw.

0
user3844776
Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)

Nummer vier mit N. ändern.

0
user3110552
select sal,ename from emp e where
 2=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 3=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 4=(select count(distinct sal) from emp  where e.sal<=emp.sal) order by sal desc;
0
Ankush

In PostgreSQL das N-te größte Gehalt aus der Employee-Tabelle ermitteln.

SELECT * FROM Employee WHERE salary in 
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
ORDER BY salary ASC LIMIT 1;
0

MySQL-Abfrage : Angenommen, ich möchte die max. Gehaltsform Mitarbeiter Tabelle herausfinden

select salary 
form employee
order by salary desc
limit n-1,1 ;
0
mjp

Einfache SQL-Abfrage, um die Mitarbeiterdetails abzurufen, die Nth MAX Salary in der Tabelle Employee enthalten.

sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;

Betrachte die Tabellenstruktur als:

Angestellter ( Id [int Primärschlüssel auto_increment], Name [varchar (30)], Salary [int]);

Beispiel:

Wenn Sie in der obigen Tabelle ein 3. MAX-Gehalt benötigen, lautet die Abfrage:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;

Ähnlich:

Wenn Sie in der obigen Tabelle ein 8. MAX-Gehalt benötigen, lautet die Abfrage:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;

HINWEIS: Wenn Sie den Wert NthMAX erhalten müssen, sollten Sie OFFSET als (N - 1) angeben.

So können Sie bei Gehaltszahlungen in aufsteigender Reihenfolge die gleiche Operation durchführen.

0
Rahul Raina

Führen Sie in SQL Server einfach Folgendes aus:

select distinct top n+1 column from table order by column desc

Und dann den ersten Wert wegwerfen, wenn Sie ihn nicht brauchen.

0
Blorgbeard

Ein weiteres für Oracle mit analytischen Funktionen:

select distinct col1 --distinct is required to remove matching value of column
from 
( select col1, dense_rank() over (order by col1 desc) rnk
  from tbl
)
where rnk = :b1
0
Eugene Patek

Diese Frage wurde einfach ausgegraben, als ich selbst nach der Antwort suchte. Dies scheint für SQL Server 2005 zu funktionieren (abgeleitet von Blorgbeards Lösung ):

SELECT MIN(q.col1) FROM (
    SELECT
        DISTINCT TOP n col1
        FROM myTable
        ORDER BY col1 DESC
) q;

Das ist effektiv eine SELECT MIN(q.someCol) FROM someTable q, wobei das oberste n der Tabelle von der SELECT DISTINCT...-Abfrage abgerufen wird.

0
Phil H

für SQL 2005:

SELECT col1 from 
     (select col1, dense_rank(col1) over (order by col1 desc) ranking 
     from t1) subq where ranking between 2 and @n
0
JesseG

Antwort: Oberste Sekunde:

select * from (select * from deletetable   where rownum <=2 order by rownum desc) where rownum <=1
0
parveen