Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 11h04   #1
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Par défaut Constitution d'un chandelier

Bonjour,

je récupère des données financières d'euronext sous forme de fichiers textes que je stocke en base. Voici un exemple de fichier

Je souhaite créer des chandeliers à partir de ces données (plus haut, plus bas, ouverture, cloture) sur un groupement donné (1min, 5min, 1heure etc...). Pas de problème de récupération du max, min et de groupement mais comment faire pour récupérer dans un groupement et dans une seule requete la première et la dernière ligne correspondant à l'ouverture et à la cloture ? Je sais récupérer la première ou la dernière ligne d'un groupement en triant le sous ensemble avant mais je sais pas récupérer les 2 en même temps...

Dois je créer 2 sous groupes triés asc et desc pour récupérer ces 2 valeurs ?

Merci de vos idées
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 15h55   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
J'ai réussi en procédant en 2 sous regroupements mais c'est pas vraiment optimisé...Suis pas contre une meilleure solution

Voilà mes 2 tables et ma requête (désolé pour le mix avec PHP) :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
SELECT g1.jour, DATE_FORMAT(g1.heure, '%H:%i') AS heure, g1.ouverture, g2.cloture, g1.minimum, g1.maximum FROM (			
					SELECT MIN(g_asc.id) AS min_id, g_asc.jour, g_asc.heure, g_asc.cours AS ouverture, MIN(g_asc.cours) AS minimum, MAX(g_asc.cours) AS maximum FROM (			
						SELECT h.id, h.jour, h.heure, h.cours FROM historique AS h
						INNER JOIN insertions AS i
						ON h.symbole=i.id
						WHERE i.symbole=\''.$objet->symbole.'\' 
						AND CAST(CONCAT(h.jour, \' \', h.heure) AS DATETIME) BETWEEN \''.$objet->de.'\' AND \''.$objet->a.'\'	
						ORDER BY h.jour, EXTRACT(HOUR_MINUTE FROM h.heure), h.last_id 
					) AS g_asc
					GROUP BY g_asc.jour, EXTRACT(HOUR_MINUTE FROM g_asc.heure)
				) AS g1
				INNER JOIN (
					SELECT MIN(g_desc.id) AS min_id, g_desc.jour, g_desc.heure, g_desc.cours AS cloture FROM (			
						SELECT h.id, h.jour, h.heure, h.cours FROM historique AS h
						INNER JOIN insertions AS i
						ON h.symbole=i.id
						WHERE i.symbole=\''.$objet->symbole.'\' 
						AND CAST(CONCAT(h.jour, \' \', h.heure) AS DATETIME) BETWEEN \''.$objet->de.'\' AND \''.$objet->a.'\'	
						ORDER BY h.jour, EXTRACT(HOUR_MINUTE FROM h.heure), h.last_id DESC 
					) AS g_desc
					GROUP BY g_desc.jour, EXTRACT(HOUR_MINUTE FROM g_desc.heure)			
				) AS g2
				ON g1.min_id=g2.min_id
				ORDER BY g1.jour, g1.heure

Code sql :
1
2
3
4
5
6
7
8
 
CREATE TABLE `insertions` (
 `id` tinyint(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `symbole` varchar(10) NOT NULL,
 `code` smallint(6) DEFAULT NULL,
 `isin` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE TABLE `historique` (
 `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `symbole` tinyint(4) UNSIGNED NOT NULL,
 `jour` date NOT NULL,
 `heure` time NOT NULL,
 `bourso_euro` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
 `last_id` int(11) NOT NULL DEFAULT '0',
 `cours` decimal(7,3) UNSIGNED NOT NULL,
 `volume` mediumint(5) UNSIGNED NOT NULL,
 `sens` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 KEY `fk` (`symbole`),
 CONSTRAINT `historique_ibfk_1` FOREIGN KEY (`symbole`) REFERENCES `insertions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1961569 DEFAULT CHARSET=latin1
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 21h38   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Vous aurez beaucoup de mal à trouver une solution optimisée car MySQL ne supporte pas les fonction de fenêtrage qui vous serait extrêmement précieuses dans ce cas....

Bref, passez au moins à PostGreSQL !

A lire : http://sqlpro.developpez.com/article...-window/#LVIII

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2011, 00h41   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

effectivement certaines absences de fonction et/ou de contraintes sur MySQL me font migrer progressivement (et définitivement je pense) vers pg.

En l'occurrence, ceci est un vieux projet plus ou moins personnel et les temps de réaction ne sont pas trop importants. Ici, la requête tourne en 1s30 environ ce qui est largement acceptable donc je ne vais pas tout migrer.

Excellent le lien sinon, je connaissais rank() mais pas [FIRST/LAST]_VALUE. C'est toujours bon à connaitre ce genre de fonction

Merci
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h54.


 
 
 
 
Partenaires

Hébergement Web