web-dev-qa-db-fra.com

Requête pour trouver la nième valeur maximale d'une colonne

Je veux trouver la 2ème, 3ème..nième valeur maximale d'une colonne

24
kiritsinh parmar

Vous pouvez trier la colonne en format décroissant, puis obtenir la valeur à partir de la nième ligne.

MODIFIER::

Mis à jour selon la demande de commentaire.WARNINGcomplètement non testé!

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

Quelque chose comme ce qui précède devrait fonctionner pour Oracle ... vous devrez peut-être obtenir la syntaxe correcte en premier!

11
TK.

Considérez la table des employés suivante avec une seule colonne pour le salaire.

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

La requête suivante renvoie l'élément Nth Maximum.

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

Pour par exemple. lorsque la deuxième valeur maximale est requise,

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

Vous n'avez pas spécifié quelle base de données, vous pouvez faire sur MySQL

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

Souhaitez sauter les 7 premiers, puis vous obtenez les dix prochaines plus élevé.

7
Pieter

Là encore, vous devrez peut-être réparer votre base de données, mais si vous souhaitez que la deuxième valeur d'un jeu de données comportant potentiellement la valeur dupliquée, vous souhaiterez également créer un groupe:

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

Souhaitez ignorer les deux premiers, puis vous obtiendrez les cinq prochains plus élevé. 

5
Steven Dickinson

Pure SQL (note: je recommanderais l’utilisation de fonctionnalités SQL spécifiques à votre SGBD, car ce sera probablement plus efficace). Cela vous donnera la n + 1ème valeur la plus grande (pour obtenir la plus petite valeur, retournez le <). Si vous avez des doublons, faites-les 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

(Nom de la table = Étudiant, Nom de la colonne = Marque)

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

Vous pouvez trouver la nième plus grande valeur de colonne en utilisant la requête suivante:

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

Pour trouver le Nième max sal.

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

où n = 1, 2, 3, .... nième valeur maximale.

1
rashedcs

Voici une méthode pour Oracle. Cet exemple obtient la 9ème valeur la plus élevée. Remplacez simplement le 9 par une variable bind contenant la position que vous recherchez.

   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

Si vous voulez la nième valeur unique, vous devez ajouter DISTINCT sur le bloc de requête le plus à l'intérieur.

1
Dave Costa

Ceci est une requête pour obtenir le nth le plus élevé de la colonne, mettez n = 0 pour le deuxième plus élevé et n = 1 pour le 3ème le plus élevé, etc.

 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

Je pense que la requête ci-dessous fonctionnera parfaitement sur Oracle sql ... Je l’ai testée moi-même ..

Informations relatives à cette requête: cette requête utilise deux tables nommées employee et department avec des colonnes dans l'employé nommé: name (nom de l'employé), dept_id (commun à l'employé et au service), salary

Et les colonnes de la table department: dept_id (commun à la table employee également), 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

merci

0
ria

Solution pour trouver la Nième valeur maximale d'une colonne particulière dans SQL Server:

Table des employés:

Employee Table

Tableau de vente:

Sales Table

Données de la table des employés:

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

Données du tableau des ventes:

=================
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

Requête pour connaître les détails d'un employé ayant réalisé la plus forte vente/N ème vendeur

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) );

Dans le WHERE (0) remplacer 0 par n-1

Résultat:

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

Vous pouvez simplifier comme ça 

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

Si le Sal contient des valeurs en double, utilisez-le.

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

le 4 sera la nième valeur, il peut contenir n'importe quelle valeur maximale telle que 5 ou 6, etc.

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

Changer le numéro quatre avec N.

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

Dans PostgreSQL, trouver le N-ème salaire le plus élevé dans la table des employés.

SELECT * FROM Employee WHERE salary in 
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
ORDER BY salary ASC LIMIT 1;
0
Trung Lê Hoàng

Requête mysql : supposons que je souhaite connaître la nième table des employés du formulaire de salaire maximum

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

Requête SQL simple pour obtenir les détails de l'employé qui a Nth MAX Salary dans la table Employee.

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

Considère la structure de la table comme:

Employé ( Id [auto_increment clé primaire]], Nom [varchar (30)], Salaire [int]);

Exemple:

Si vous avez besoin du 3ème salaire MAX dans le tableau ci-dessus, la requête sera:

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

De même:

Si vous avez besoin du 8ème salaire MAX dans le tableau ci-dessus, la requête sera:

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

REMARQUE: Lorsque vous devez obtenir la valeur NthMAX, vous devez indiquer OFFSET sous la forme (N - 1).

Comme ceci, vous pouvez effectuer le même type d'opération en cas de salaire croissant.

0
Rahul Raina

Dans SQL Server, il suffit de:

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

Et jetez ensuite la première valeur, si vous n'en avez pas besoin.

0
Blorgbeard

Un autre pour Oracle utilisant des fonctions analytiques:

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

J'ai juste creusé cette question en cherchant moi-même la réponse, et cela semble fonctionner pour SQL Server 2005 (dérivé de solution de Blorgbeard ):

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

Effectivement, il s’agit d’une SELECT MIN(q.someCol) FROM someTable q, avec le n supérieur de la table récupérée par la requête SELECT DISTINCT....

0
Phil H

pour 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

Réponse: Top seconde:

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