web-dev-qa-db-fra.com

Comment récupérer le premier et le dernier enregistrement d'un enregistrement groupé dans une requête MySQL avec des fonctions d'agrégation?

J'essaie de récupérer le premier et le dernier enregistrement d'un enregistrement "groupé".
Plus précisément, je fais une requête comme celle-ci

SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)

mais j'aimerais avoir le premier et le dernier record du groupe. Cela pourrait être fait en faisant des tonnes de demandes mais j'ai une assez grande table.

Existe-t-il un moyen (temps de traitement faible si possible) de le faire avec MySQL?

29
Jimmy

Vous souhaitez utiliser GROUP_CONCAT et SUBSTRING_INDEX:

SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) AS open
SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) AS close 

Cela évite les sous-requêtes coûteuses et je le trouve généralement plus efficace pour ce problème particulier.

Consultez les pages de manuel des deux fonctions pour comprendre leurs arguments, ou visitez cet article qui comprend un exemple de la façon de faire conversion de la période dans MySQL pour plus d'explications.

53
Joao Costa

Essayez ceci pour commencer ...:

Select YearWeek, Date, Min(Low_Price), Max(High_Price)
From
   (Select YEARWEEK(date) YearWeek, Date, LowPrice, High_Price
    From Symbols S
    Where Date BETWEEN(.. ..)
    GROUP BY YEARWEEK(date)) Z
Group By YearWeek, Date
2
Charles Bretana

Voici une excellente solution spécifique à ce problème spécifique: http://topwebguy.com/first-and-last-in-mysql-a-working-solution/ C'est presque aussi simple que d'utiliser FIRST et DERNIER dans MySQL.

Je vais inclure le code qui fournit réellement la solution, mais vous pouvez rechercher tout le texte:

SELECT
Word ,  

(SELECT a.ip_addr FROM article a
WHERE a.Word = article.Word
ORDER BY a.updated  LIMIT 1) AS first_ip,

(SELECT a.ip_addr FROM article a
WHERE a.Word = article.Word
ORDER BY a.updated DESC LIMIT 1) AS last_ip

FROM notfound GROUP BY Word;
0
webmaster