J'utilise Microsoft SQL Server. J'ai la requête suivante, qui renvoie, comme prévu, les colonnes sélectionnées, classées et classées par date_fin. end_date est de type datetime.

select 
    rank() over (order by end_date desc) rownum, 
    salary, name, end_date
from
    employee
order by 
    end_date desc

Comment puis-je modifier et / ou ajouter à cela pour extraire uniquement la première ligne renvoyée? Cela peut-il être fait avec une modification de la requête ci-dessus, ou dois-je ajouter une logique supplémentaire?

2
Scott 26 janv. 2019 à 19:35

4 réponses

Meilleure réponse

En règle générale, la méthode la plus rapide (avec le bon index) est une sous-requête corrélée:

select 1 as rownum, salary, name, endmonth, name 
from employee e
where e.endmonth = (select max(e2.endmonth)
                    from employee e2
                   );

L'index souhaité se trouve sur employee(endmonth).

Si vous savez qu'il y aura une ligne, alors order by avec fetch first (ou l'équivalent de vos bases de données) est la meilleure approche:

select 1 as rownum, salary, name, endmonth, name 
from employee e
order by e.endmonth desc
fetch first one row only;

Si votre base de données prend en charge with ties, vous pouvez l'utiliser. Par exemple, dans SQL Server:

select top (1) with ties 1 as rownum, salary, name, endmonth, name 
from employee e
order by e.endmonth desc;
3
Gordon Linoff 26 janv. 2019 à 17:05

C'est comme Lukasz l'a dit, mais vous pouvez également utiliser ROW_NUMBER, cela ne renvoie pas de valeurs en double comme RANK afin que vous puissiez obtenir une ligne en particulier en premier.

Voir: SQL RANK () contre ROW_NUMBER ()

SELECT *
FROM (select ROW_NUMBER() over (order by endmonth desc) rownum,
             salary, name, endmonth, name 
      from employee e) s
WHERE rownum = 1;
0
Fernando dos Santos 26 janv. 2019 à 16:51
select rank() over (order by endmonth desc) rownum, salary, name, 
endmonth, name 
from employee e
limit 1;

J'espère que cela t'aides

0
Sanyam Churiwala 26 janv. 2019 à 17:00

Utilisation de la sous-requête:

SELECT *
FROM (select rank() over (order by endmonth desc) rownum,
             salary, name, endmonth
      from employee e) s
WHERE rownum = 1;

Ou l'option WITH TIES (spécifique à SQL Server - peut générer un plan d'exécution moins bon):

select TOP 1 WITH TIES rank() over (order by endmonth desc) rownum,
                 salary, name, endmonth, name 
from employee e
order by rownum
4
Scott 27 janv. 2019 à 11:35