4 votes

Comment puis-je trouver le second maximum de ma requête ?

Voici ma requête SQL pour trouver une ligne dans le fichier currency_price tableau groupé par date maximale d'insertion dans le tableau. Ma question est la suivante : comment trouver la seconde maximum . Je veux dire comment puis-je changer cette requête pour trouver le deuxième rang maximum dans chaque groupe :

select currency_id,buy,sell 
from (select * from currency_price  order by `currency_id`, cu_date desc,buy,sell) x 
group by `currency_id`

Avec cette requête, j'ai trouvé une ligne pour chaque identifiant, donc par exemple j'ai vendu et acheté pour chaque identifiant .exm :

id    sell buy
1000  500  480
1001  20   19
...

mais ici je veux la deuxième date maximale pour chaque id.

Je connais quelques requêtes pour trouver le second maximum mais tout ne me mène pas à ma réponse.

1voto

Mangesh Sathe Points 789

Si c'est MySql, utilisez LIMIT 1,1 ; # Récupérer les lignes [commencer par rec]1-[récupérer le nombre de rec]1

http://dev.mysql.com/doc/refman/5.7/en/select.html

0voto

Tomás Points 396

Utiliser ROW_NUMBER()

Echantillon

SELECT * FROM 
(
SELECT *,ROW_NUMBER() OVER (ORDER BY AGE DESC) RNUM  FROM TEST_TABLE
) QUERY1 WHERE RNUM=2

0voto

PaulF Points 5185

Vous pourriez ajouter manuellement un numéro de commande groupée à votre requête ordonnée initiale, puis sélectionner le second dans chaque ligne.

La requête interne ordonne comme il se doit et numérote les lignes à partir de 1, en remettant à zéro chaque fois que le currency_id change.

set @num := 0, @ci := -1;

select currency_id,buy,sell 
from
  (select *,
    @num := if(@ci = currency_id, @num + 1, 1) as gp_number,
    @ci := currency_id as dummy 
  from currency_price
  order by `currency_id`, cu_date desc,buy,sell) x
where gp_number=2

Cela pourrait être mis dans une procédure stockée à partir du workbench comme suit :

DELIMITER $$
CREATE PROCEDURE SecondMaximum()
BEGIN
set @num := 0, @ci := -1;

select currency_id,buy,sell 
from
  (select *,
    @num := if(@ci = currency_id, @num + 1, 1) as gp_number,
    @ci := currency_id as dummy 
  from currency_price
  order by `currency_id`, cu_date desc,buy,sell) x
where gp_number=2;
END$$

DELIMITER ;

Et depuis PHP, vous exécutez "CALL SecondMaximum() ;".

Si vous souhaitez pouvoir modifier les tables et/ou les champs, vous pouvez les transmettre à la procédure en tant que variables de type chaîne, puis créer et exécuter une instruction préparée dans la procédure stockée. Il suffit de faire une recherche sur Google pour trouver des tutoriels à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X