|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 7 ![]() |
Bonjour,
Est-il possible de faire "avec un ordre SQL simple", un GROUP BY uniquement sur des lignes contiguës ? Je m'explique. Soit les données suivantes: COL.A COL.B COL.C -------------------- V1 V2 2 V1 V2 4 V1 V2 1 V1 V3 1 V1 V3 5 V1 V3 6 V1 V2 7 V1 V2 2 V1 V2 9 J'aimerai obtenir: COL.A COL.B MIN(COL.C) MAX(COL.C) -------------------------------------- V1 V2 1 4 V1 V3 1 6 V1 V2 2 9 Merci par avance |
|
|
00
|
|
|
#2 | ||
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 162 ![]() |
Je ne comprend pas trop bien ce que tu cherches à faire.
Qu'est ce qu'une ligne contigue pour toi ? Peux tu nous laisser la definition de ta table ainsi qu'un script nous permettant de la remplir aisement afin de tester ? Au cas ou... Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 7 ![]() |
C'est vrai que mon exemple n'est pas top.
Je prends la table PRIME suivante: DATE | PRIME ------------ 01/01/2008 ; 10,00 02/01/2008 ; 10,00 03/01/2008 ; 10,00 04/01/2008 ; 15,00 05/01/2008 ; 15,00 06/01/2008 ; 15,00 07/01/2008 ; 10,00 08/01/2008 ; 10,00 Je souhaiterai obtenir le résultat suivant: DEBUT ; FIN ; PRIME ---------------------------- 01/01/2008 ; 03/01/2008 ; 10,00 04/01/2008 ; 06/01/2008 ; 15,00 07/01/2008 ; 08/01/2008 ; 10,00 Si je passe par le SELECT suivant: Code :
DEBUT ; FIN ; PRIME ---------------------------- 01/01/2008 ; 08/01/2008 ; 10,00 04/01/2008 ; 06/01/2008 ; 15,00 et c'est ce que je ne veux pas. |
||
|
|
00
|
|
|
#4 |
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 162 ![]() |
Comment définis tu la date de début et la date de fin ?
Est ce arbitrairement fixé ? Est ce une contrainte business ? Est ce sur la variation de la valeur de la prime ? |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 7 ![]() |
La date de début et de fin sont le min et la max du champ DATE pour toutes les lignes contiguës avec la même PRIME
|
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Ce que vous voulez faire c'est de l'agrégation de période. Les requêtes pour faire cela sont EXTREMEMENT compliquées. Soit le nombre de tranche est peu élevé et je vous conseille de faire cela dans un curseur, soit le nombre de ligne est élevé et dans ce cas il y a du travail.
Ayant déjà, fait cela pour un de mes clients, je peut vous dire que c'est le genre de requête qui m'a demandé 2 jours de boulots facturé 1600 euros... 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 * * * * * |
|
00
|
|
|
#7 | ||||||
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Initialisation des tables :
Code :
Code :
On est obligé de mettre MAXRECURSION 0 pour fonctionner avec des zones contigües de plus de 100 jours. Je ne sait pas ce que ça vaut niveau perfs. Solution sans CTE : Code :
On peut un peu modifier les critères pour ne pas considérer comme contigus les jours espacés ou les jours en double. Si les tarifs n'ont pas bougés depuis 2008, je voudrais bien monnayer mes CTE à 1600 euros |
||||||
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : janvier 2009 Messages : 14 ![]() |
Une question, est ce pour une utilisation unique? ou pour un lancement régulier d'une requête?
Pour une utilisation unique, avec un cursor, cela est le plus simple. On parcourt la table et on la met à jour. Pour une utilisation régulière à mon avis il manque fonctionnellement des datas. Se baser sur le changement d'une valeur pour calculer des périodes, c'est pas top. |
|
|
00
|
|
|
#9 | ||
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Qui parle de mise à jour ici ?
Citation:
Quel rapport avec l'utilisation régulière ou unique ? Citation:
si ce besoin est exprimé, c'est qu'il correspond à quelque chose, non ? |
||
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
J'ai publié différentes solution sur mon blog, il y a un certain temps :
http://blog.developpez.com/sqlpro/p7...valles-en-sql/ http://blog.developpez.com/sqlpro/p9...lles-en-sql-1/ 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 * * * * * |
|
00
|
|
|
#11 |
|
Membre confirmé
![]() ![]() Inscription : novembre 2007 Messages : 134 ![]() |
Bonjour SqlPro,
Existe t il des sortes de "patterns" en sql comme il en existe en développement ? Bien souvent on peut trouver différentes solutions pour résoudre un problème, hors à moins de prendre beaucoup de temps pour les chercher toutes, puis les tester pour en désigner la ou les meilleures, on prend la première idée qui fonctionne. Des livres intéressants peut être ? Merci |
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Voici une autre solution sans curseur ni récursivité. Il lui faudra cependant un index sur (jour, montant) Code SQL :
|
||
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Inscription : juin 2007 Messages : 115 ![]() |
Très belle solution !
Surement bien plus efficace que la mienne avec CTE, sous-requêtes et fonctions de fenêtrage ! Pas plus que avec les autres solutions. Et puis c'est juste pour les perfs, si il y a que 1000 lignes l'index est inutile |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com