mysql : requête entre plusieurs lignes N, N-1, N-2, etc...

mysql : requête entre plusieurs lignes N, N-1, N-2, etc... - SQL/NoSQL - Programmation

Marsh Posté le 23-06-2004 à 09:08:11    

Bonjour,
 
Je bloque sur un sujet qui me semblait pourtant facile, mais je n'ai rien trouvé, à moins que ce soit mon explication et les mots que j'utilise pour mes recherches qui soient défaillants :
 
J'ai une grosse table MySQL, avec un champ date (unique, donc je m'en sers comme clé index N à une date précise, N-1 pour la date immédiatement antérieure, N-2 pour 2 jours avant, etc...), un champ cours.
 
Je veux sortir tous les enregistrements "cours" pour lesquels :
cours (N) / cours (N-1) > 1.05
ou encore : cours(N) / cours(N-2) > 1.1
 
Merci pour vos réponses (enfin, si c'est possible)  :)  

Reply

Marsh Posté le 23-06-2004 à 09:08:11   

Reply

Marsh Posté le 23-06-2004 à 09:26:18    

Salut,
 
 Etant donné que tu as visiblement plusieurs types de conditions ( peut etre dans la meme page ), le plus simple serait de charger tous le contenu de la table ( si celle ci n'est pas trop grosse) dans un tableau ( ou un objet ) via un select.
 
Ensuite tu pourra plus facilement opéré les conditons, car les tableaux se prètent bien à ces manipulations en index.
 
De plus, je ne suis pas sur que cela soit tres simple de faire ceci en mysql
 
Pierre


Message édité par Lord II le 23-06-2004 à 09:26:50
Reply

Marsh Posté le 23-06-2004 à 09:44:51    

En fait, au début, juste une condition m'intéresse.
 
Je peux aussi, pour simplifier, mettre une clé AUTOINCREMENT qui va remplacer le champ chronologique de mon enregistrement.
 
J'aimerais donc sortir les enregistrements N qui correspondent à la condition :
cours (N) / cours (N-1) > 1.05  
 
Merci

Reply

Marsh Posté le 23-06-2004 à 09:48:25    

Cela ne peut pas focntionner car les opérations et fonctions dans le "where" ne se font il me semble que sur la meme ligne, donc on ne peut pas recupérer la valeur de cours pour le jour suivant.
 
A mon avis la méthode que je t'ai exposé fonctionne et est assez rapide si la table n'est pas trop grosse.

Reply

Marsh Posté le 23-06-2004 à 10:12:03    

Merci pour ta réponse, ça explique pourquoi je ne trouvais pas : ça n'existe pas !
 
Mais ma table est assez grosse.
 
Je vais alors pallier à ce problème en rajoutant lors de chaque enregistrement un champ par rapport à N-1 et N-2.
Au moins, je ferais mes premières requêtes par mySQL, et ensuite je les traiterai avec PHP
 
Merci donc !

Reply

Marsh Posté le 23-06-2004 à 10:22:48    

Qu'est ce que tu entends par assez grosse. Ensuite cela dépends aussi du nombre de champ. Cel ane sert à rien de reproduire des informations déjà présente ailleurs dans la base.


Message édité par Lord II le 23-06-2004 à 10:23:19
Reply

Marsh Posté le 23-06-2004 à 12:01:56    

essaie ça...
 
select t1.cours, t1.ladate, t2.cours, t2.ladate
from latable t1, latable t2
where t2.ladate = t1.ladate -1
and t1.cours / t2.cours > 1.05
 
Logiquement ça doit marcher...

Reply

Marsh Posté le 23-06-2004 à 14:23:59    

Lord ii :
Assez grosse: 1500 enregistrements, avec 5 champs fixes, et là j'allais doubler le nombre de champs fixes (avec mes formules).
 
Arjuna :
je viens de voir ta proposition, ça semble intéressant (ça a l'air pas mal comme astuce), je vais d'abord tester.

Reply

Marsh Posté le 23-06-2004 à 14:32:14    

Vu le faible nombre de lignes dans ta table, la méthode d'Arjuna devrait tourner rapidement ;) (enfin il te faut un index sur ladate, mais d'après ce que j'ai compris, il existe).


Message édité par Beegee le 23-06-2004 à 14:32:28
Reply

Marsh Posté le 23-06-2004 à 14:49:20    

papa6 a écrit :

Lord ii :
Assez grosse: 1500 enregistrements, avec 5 champs fixes, et là j'allais doubler le nombre de champs fixes (avec mes formules).


Ce que j'aime bien, c'est la notion de "assez grosse" :D
 

Citation :

SQL> desc evl;
 Name                            Null?    Type
 ------------------------------- -------- ----
 ACHVTE                                   VARCHAR2(1)
 TYPEVE                                   VARCHAR2(3)
 NUMEVE                                   NUMBER(38)
 NUMPOS                                   NUMBER(38)
 NUMLIG                                   NUMBER(38)
 DATLIV                                   VARCHAR2(8)
 CODSTA                                   VARCHAR2(2)
 NUMADR                                   NUMBER(38)
 MODLIV                                   VARCHAR2(3)
 SIGTRA                                   VARCHAR2(12)
 MODTRA                                   VARCHAR2(2)
 SIGDEP                                   VARCHAR2(12)
 NUMLOT                                   VARCHAR2(7)
 QTELIV                                   NUMBER
 QTECDE                                   NUMBER
 TYPEVO                                   VARCHAR2(3)
 NUMEVO                                   NUMBER(38)
 NUMPOO                                   NUMBER(38)
 NUMLIO                                   NUMBER(38)
 NBRCOL                                   NUMBER(38)
 DATMOD                                   VARCHAR2(8)
 UTIMOD                                   VARCHAR2(8)
 ACHVTO                                   VARCHAR2(1)
 ACHVTS                                   VARCHAR2(1)
 TYPEVS                                   VARCHAR2(3)
 NUMEVS                                   NUMBER(38)
 NUMPOSS                                  NUMBER(38)
 NUMLIS                                   NUMBER(38)
 PERLIV                                   NUMBER(38)
 DATVAL                                   VARCHAR2(8)
 DATEXP                                   VARCHAR2(8)
 PERVAL                                   NUMBER(38)
 PEREXP                                   NUMBER(38)
 ANNLIV                                   NUMBER(38)
 ANNVAL                                   NUMBER(38)
 ANNEXP                                   NUMBER(38)
 QTESUP1                                  NUMBER
 QTESUP2                                  NUMBER
 QTESUP3                                  NUMBER
 INDVER                                   VARCHAR2(1)
 DELLIV                                   NUMBER(38)
 DELENG                                   NUMBER(38)
 DATENG                                   VARCHAR2(8)
 CODEMP                                   VARCHAR2(10)
 NUMADR_DEP                               NUMBER(38)
 LIBCOM                                   VARCHAR2(30)
 QTEPERDU                                 NUMBER
 ORDEVS                                   NUMBER(38)
 INDAPR                                   VARCHAR2(1)
 TYPLIV                                   VARCHAR2(3)
 SIGLIV                                   VARCHAR2(12)
 CODSOC                                   NUMBER(38)
 MODLOC                                   VARCHAR2(30)
 CODTRN                                   VARCHAR2(6)
 CODPRO                                   VARCHAR2(16)
 CODRGP                                   VARCHAR2(2)
 QTESUP4                                  NUMBER
 QTESUP5                                  NUMBER
 QTESUP6                                  NUMBER
 NUMADR_I                                 NUMBER(38)
 ACHVTEISE                                VARCHAR2(1)
 TYPISE                                   VARCHAR2(3)
 NUMISE                                   NUMBER(38)
 NUMIPA                                   NUMBER(38)
 NUMISP                                   NUMBER(38)
 SIGTRS                                   VARCHAR2(12)
 BATVOL                                   VARCHAR2(30)
 CMPNIE                                   VARCHAR2(30)
 NLTA                                     VARCHAR2(30)
 DATDEP                                   VARCHAR2(8)
 DATARR                                   VARCHAR2(8)
 HEUARR                                   VARCHAR2(8)
 HEUDEP                                   VARCHAR2(8)
 
SQL> select count(*) from evl;
 
COUNT(*)
---------
3670638
                   
SQL> spool off


 
 :hello:
 
(et encore, c'est loin d'être la plus grosse, les tables de gestion des stocks ou financière sont 20 fois pires ;))


Message édité par Arjuna le 23-06-2004 à 14:52:26
Reply

Marsh Posté le 23-06-2004 à 14:49:20   

Reply

Marsh Posté le 23-06-2004 à 16:23:34    

On va pas jouer à la plus grosse, hein ? :D
 

Code :
  1. SQL> desc costedevent;
  2. Name                                      Null?    Type
  3. ----------------------------------------- -------- ----------------------------
  4. ACCOUNT_NUM                               NOT NULL VARCHAR2(20)
  5. EVENT_SEQ                                 NOT NULL NUMBER(9)
  6. EVENT_SOURCE                              NOT NULL VARCHAR2(40)
  7. EVENT_TYPE_ID                             NOT NULL NUMBER(9)
  8. EVENT_REF                                 NOT NULL VARCHAR2(16)
  9. CLUSTER_SUB_ID                            NOT NULL NUMBER(9)
  10. CREATED_DTM                               NOT NULL DATE
  11. EVENT_DTM                                 NOT NULL DATE
  12. EVENT_COST_MNY                            NOT NULL NUMBER(18)
  13. MANAGED_FILE_ID                           NOT NULL NUMBER(9)
  14. ROW_NUMBER                                NOT NULL NUMBER(18)
  15. MODIFIED_BOO                              NOT NULL VARCHAR2(1)
  16. COST_CENTRE_ID                                     NUMBER(9)
  17. TARIFF_ID                                          NUMBER(9)
  18. EVENT_ATTR_1                                       VARCHAR2(40)
  19. EVENT_ATTR_2                                       VARCHAR2(40)
  20. EVENT_ATTR_3                                       VARCHAR2(40)
  21. EVENT_ATTR_4                                       VARCHAR2(40)
  22. EVENT_ATTR_5                                       VARCHAR2(40)
  23. EVENT_ATTR_6                                       VARCHAR2(40)
  24. EVENT_ATTR_7                                       VARCHAR2(40)
  25. EVENT_ATTR_8                                       VARCHAR2(40)
  26. EVENT_ATTR_9                                       VARCHAR2(40)
  27. EVENT_ATTR_10                                      VARCHAR2(40)
  28. EVENT_ATTR_11                                      VARCHAR2(40)
  29. EVENT_ATTR_12                                      VARCHAR2(40)
  30. EVENT_ATTR_13                                      VARCHAR2(40)
  31. EVENT_ATTR_14                                      VARCHAR2(40)
  32. EVENT_ATTR_15                                      VARCHAR2(40)
  33. EVENT_ATTR_16                                      VARCHAR2(40)
  34. EVENT_ATTR_17                                      VARCHAR2(40)
  35. EVENT_ATTR_18                                      VARCHAR2(40)
  36. EVENT_ATTR_19                                      VARCHAR2(40)
  37. EVENT_ATTR_20                                      VARCHAR2(40)
  38. EVENT_ATTR_21                                      VARCHAR2(40)
  39. EVENT_ATTR_22                                      VARCHAR2(40)
  40. EVENT_ATTR_23                                      VARCHAR2(40)
  41. EVENT_ATTR_24                                      VARCHAR2(40)
  42. LOYALTY_POINTS                                     NUMBER(9)
  43. COMPETITOR_COST_MNY                                NUMBER(18)
  44. INTERNAL_COST_MNY                                  NUMBER(18)
  45. EXTERNAL_COST_MNY                                  NUMBER(18)
  46. FRAGMENT_NUMBER                                    NUMBER(6)
  47. IMPORTED_COST_MNY                                  NUMBER(18)
  48. IMPORTED_CURRENCY_CODE                             VARCHAR2(3)
  49. RATING_DISCOUNTED_USAGE_TOTAL                      NUMBER(18)
  50. PRE_DISCOUNTED_COST_MNY                            NUMBER(18)
  51. HIGHEST_PRIORITY_DISCOUNT_ID                       NUMBER(9)
  52. TAX_OVERRIDE_ID                                    NUMBER(9)
  53. UST_CATEGORY_ID                                    NUMBER(9)
  54. UST_CODE_ID                                        NUMBER(9)
  55. ORIGINAL_ACCOUNT_NUM                               VARCHAR2(20)
  56. RULE_NUMBER                                        NUMBER(1)
  57. EVENT_ATTR_25                                      VARCHAR2(40)
  58. EVENT_ATTR_26                                      VARCHAR2(40)
  59. EVENT_ATTR_27                                      VARCHAR2(40)
  60. EVENT_ATTR_28                                      VARCHAR2(40)
  61. EVENT_ATTR_29                                      VARCHAR2(40)
  62. EVENT_ATTR_30                                      VARCHAR2(40)
  63. EVENT_ATTR_31                                      VARCHAR2(40)
  64. EVENT_ATTR_32                                      VARCHAR2(40)
  65. EVENT_ATTR_33                                      VARCHAR2(40)
  66. EVENT_ATTR_34                                      VARCHAR2(40)
  67. EVENT_ATTR_35                                      VARCHAR2(40)
  68. EVENT_ATTR_36                                      VARCHAR2(40)
  69. HIGHEST_PRIORITY_PROD_SEQ                          NUMBER(9)
  70. RECEIVABLE_CLASS_ID                                NUMBER(9)
  71. REVENUE_CODE_ID                                    NUMBER(9)
  72. DISCOUNT_DATA                                      VARCHAR2(523)


 
Je compte même pas le nombre de lignes, la bécane mettrait 30' avant de répondre qu'il y a plus de 90.000.000 lignes ... :)

Reply

Marsh Posté le 23-06-2004 à 17:08:58    

T'as pas mieu ? :)
 


SQL> desc eve
 Name                            Null?    Type
 ------------------------------- -------- ----
 ACHVTE                                   VARCHAR2(1)
 TYPEVE                                   VARCHAR2(3)
 NUMEVE                                   NUMBER(38)
 SIGTIE                                   VARCHAR2(12)
 TYPTIE                                   VARCHAR2(3)
 NUMVER                                   NUMBER(38)
 DATEVE                                   VARCHAR2(8)
 DATVAL                                   VARCHAR2(8)
 DATCRE                                   VARCHAR2(8)
 DATLIV                                   VARCHAR2(8)
 TYPEVO                                   VARCHAR2(3)
 NUMEVO                                   NUMBER(38)
 NBRFAC                                   NUMBER(38)
 TYPFAC                                   NUMBER(38)
 CODURG                                   NUMBER(38)
 CODETA                                   VARCHAR2(1)
 CODCTG                                   VARCHAR2(2)
 REFEXT                                   VARCHAR2(16)
 NUMCNT                                   VARCHAR2(9)
 CODDEV                                   VARCHAR2(3)
 PARDEV                                   NUMBER
 NUMADR                                   NUMBER(38)
 MODLIV                                   VARCHAR2(3)
 SIGTRA                                   VARCHAR2(12)
 MODTRA                                   VARCHAR2(2)
 NBRREL                                   NUMBER(38)
 NUMREL                                   NUMBER(38)
 DATACO                                   VARCHAR2(8)
 MONACO                                   NUMBER
 TAUESC                                   NUMBER
 DATCLI                                   VARCHAR2(8)
 CODBLO                                   VARCHAR2(1)
 DATBLO                                   VARCHAR2(8)
 EXICVC                                   VARCHAR2(1)
 EXICVM                                   VARCHAR2(1)
 EXITXT                                   VARCHAR2(1)
 CUMHT                                    NUMBER
 CUMTTC                                   NUMBER
 SIGREP                                   VARCHAR2(12)
 CODANA                                   VARCHAR2(6)
 MODRGL                                   VARCHAR2(2)
 DELRGL                                   NUMBER(38)
 CODDPT                                   VARCHAR2(1)
 CODQUA                                   NUMBER(38)
 TOTCOL                                   NUMBER(38)
 SIGDEP                                   VARCHAR2(12)
 DATMOD                                   VARCHAR2(8)
 UTIMOD                                   VARCHAR2(8)
 POSFIS                                   VARCHAR2(1)
 TOTHT                                    NUMBER
 CODTVA                                   VARCHAR2(1)
 CUMPR                                    NUMBER
 LIBCOM                                   VARCHAR2(30)
 TAUREM                                   NUMBER
 MONREM                                   NUMBER
 CODANA1                                  VARCHAR2(6)
 CODANA2                                  VARCHAR2(6)
 TAUCOM                                   NUMBER
 TYPREM                                   VARCHAR2(1)
 ACHVTO                                   VARCHAR2(1)
 PERFAC                                   VARCHAR2(1)
 CAMION                                   VARCHAR2(10)
 INDAPR                                   VARCHAR2(1)
 TOTTTC                                   NUMBER
 DATEDI                                   VARCHAR2(8)
 INDEDI                                   VARCHAR2(1)
 INDSOL                                   VARCHAR2(1)
 ACHVTS                                   VARCHAR2(1)
 TYPEVS                                   VARCHAR2(3)
 NUMEVS                                   NUMBER(38)
 PEREVE                                   NUMBER(38)
 PERLIV                                   NUMBER(38)
 INDEPU                                   VARCHAR2(1)
 CODBAR                                   VARCHAR2(3)
 DATEXP                                   VARCHAR2(8)
 PERVAL                                   NUMBER(38)
 PEREXP                                   NUMBER(38)
 ANNEVE                                   NUMBER(38)
 ANNLIV                                   NUMBER(38)
 ANNVAL                                   NUMBER(38)
 ANNEXP                                   NUMBER(38)
 ACHBCH                                   VARCHAR2(1)
 TYPBCH                                   VARCHAR2(3)
 NUMBCH                                   NUMBER(38)
 INDINT                                   VARCHAR2(1)
 DELLIV                                   NUMBER(38)
 DELENG                                   NUMBER(38)
 SIGMAG                                   VARCHAR2(12)
 DATRGL                                   VARCHAR2(8)
 CODTRN                                   VARCHAR2(6)
 CODPOS                                   VARCHAR2(5)
 MONREMFAC                                NUMBER
 TAUREM2                                  NUMBER
 TAUREM3                                  NUMBER
 DATENG                                   VARCHAR2(8)
 SIGACT                                   VARCHAR2(12)
 GELEVE                                   VARCHAR2(1)
 POSHIE                                   NUMBER(38)
 EDITRT                                   VARCHAR2(1)
 SIGVAL                                   VARCHAR2(12)
 ORDEVS                                   NUMBER(38)
 BATIMENT                                 VARCHAR2(2)
 TYPLIV                                   VARCHAR2(3)
 SIGLIV                                   VARCHAR2(12)
 NUMATT                                   NUMBER(38)
 CODSOC                                   NUMBER(38)
 MODLOC                                   VARCHAR2(30)
 FACREL                                   VARCHAR2(1)
 CODASS                                   VARCHAR2(6)
 EDICTS                                   VARCHAR2(1)
 RELICA                                   VARCHAR2(1)
 ETBCOD                                   VARCHAR2(3)
 ETSSTATUT                                VARCHAR2(1)
 ACHVTT                                   VARCHAR2(1)
 CODSIT1                                  VARCHAR2(3)
 NUMVOY                                   NUMBER(38)
 NUMFIL                                   NUMBER(38)
 TAUAGIO                                  NUMBER
 MONESC                                   NUMBER
 MONAGIO                                  NUMBER
 TAUESCD                                  NUMBER
 NCOTAT                                   NUMBER(38)
 TAUCA                                    NUMBER
 P_RIBCOD                                 VARCHAR2(3)
 P_ECRNUM                                 NUMBER(38)
 CODEOP                                   VARCHAR2(12)
 NUMADR_I                                 NUMBER(38)
 ACHVTEISE                                VARCHAR2(1)
 TYPISE                                   VARCHAR2(3)
 NUMISE                                   NUMBER(38)
 SIGTRS                                   VARCHAR2(12)
 NUMLCR                                   NUMBER(38)
 BATVOL                                   VARCHAR2(30)
 CMPNIE                                   VARCHAR2(30)
 NLTA                                     VARCHAR2(30)
 DATDEP                                   VARCHAR2(8)
 DATARR                                   VARCHAR2(8)
 HEUARR                                   VARCHAR2(8)
 HEUDEP                                   VARCHAR2(8)
 GUIDRGL                                  VARCHAR2(3)
 
SQL> spool off

Reply

Marsh Posté le 23-06-2004 à 17:09:09    

Same player shoot again ;)

Reply

Marsh Posté le 23-06-2004 à 17:13:24    

:D
 
enfin le problème c'est surtout le nombre de lignes, pas la taille d'une ligne :)
 
mais on s'écarte du sujet :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed