2 votes

Comment sélectionner les deux premières lignes de chaque groupe et compter la différence entre elles dans une colonne ?

J'ai une table comme celle-là

ID_WE   ID_B    ID_WO   RDATA   RSIZE
11111   22      1   1998-10-01  14
11111   22      2   1998-09-30  17
11111   23      1   1998-10-01  23
11112   22      1   1998-09-30  14

ID_WE , ID_B y ID_WO sont des clés primaires. Pour chaque combinaison id-we, id_b, il y a quelques ID_WO . Chaque ID_WO ont un grand nombre de lectures, les informations sur les lectures sont en RDATA y RSIZE

J'ai besoin de récupérer un tableau comme suit

ID_WE   ID_B    ID_WO   DAYS    DIF
11111   22      1       1       0

DIF est la différence entre RSIZE entre les deux dernières lectures pour un ID_WO , DAYS est le nombre de jours qui se sont écoulés entre les deux dernières lectures

Il faut probablement un groupe par et peut-être max(rdata) pour que le nombre de jours et la taille soient pris en compte. Je ne sais vraiment pas comment obtenir un tel résultat. Je vous serais reconnaissant de bien vouloir m'indiquer comment obtenir les résultats souhaités.

1voto

Vignesh Kumar Points 14852

Essayez ceci

SELECT MIN(ID_WE) ID_WE,ID_B,ID_WO,DAYS,DIF
FROM
(
     SELECT MIN(ID_WE) ID_WE,MIN(ID_B) ID_B,MIN(ID_WO) ID_WO, 
            MAX(RDATA)-Min(RDATA) DAYS,MAX(RSIZE)-Min(RSIZE) DIF   
     FROM TABLE1
     GROUP BY ID_WE,ID_B
)AS G
GROUP BY ID_WE

1voto

irene Points 345

Au lieu de TABLE1, j'ai construit quelque chose qui récupère les deux derniers éléments :

SELECT MIN(ID_WE) ID_WE,ID_B,ID_WO,DAYS,DIF
FROM
 (
 SELECT MIN(d.ID_WE) ID_WE,MIN(d.ID_B) ID_B,MIN(d.ID_WO) ID_WO, 
        MAX(d.rdata)-Min(d.rdata) DAYS,MAX(d.RSIZE)-Min(d.RSIZE) DIF   
 FROM 
     (  select t.id_we, t.id_b, t.id_wo, t.max from 
       (( select b.id_we, b.id_b, b.id_wo, max(b.rdata) as max
            from test b
            where b.rdata NOT IN
                (select max(a.rdata)
                from test a
                group by a.id_we, a.id_b, a.id_wo
                )
            group by b.id_we, b.id_b, b.id_wo
        ) union
        (
          select e.id_we, e.id_b, e.id_wo, max(e.rdata)
          from test e
          group by e.id_we, e.id_b, e.id_wo
        )  
       ) t

        ) t4
        join test d on t4.id_we = d.id_we and d.id_b = t4.id_b and d.id_wo = t4.id_wo and d.rdata = t4.max
   GROUP BY t4.ID_WE,t4.ID_B
)AS G
GROUP BY ID_WE;

0voto

Majlena Points 58

Merci à tous pour vos commentaires et vos réponses, qui m'ont mis sur la bonne voie. J'ai enfin trouvé la solution. Avec l'aide de cette page sur le blog de Baron Schwartz (c'est une ressource utile si vous avez besoin de sélectionner la première/la dernière/maximum ligne par groupe en SQL).

J'obtiens le plus grand et le deuxième plus grand RDATA et ajouter aux données correspondantes RSIZE dans une requête de ce type, le plus grand(FOO) :

select oo.id_wej,oo.id_ob,oo.id_wo, oo.odata,oo.od
from (select id_wej,id_ob,id_wo,odata from odczyty
where odata = (select max(odata) from odczyty o where o.id_wej=odczyty.id_wej and o.id_ob=odczyty.id_ob and o.id_wo=odczyty.id_wo)) as x
inner join odczyty oo on oo.id_wej=x.id_wej and oo.id_ob=x.id_ob and oo.id_wo=x.id_wo and oo.odata=x.odata
order by id_wej,id_ob,id_wo)as ok
on od.id_wej=ok.id_wej and od.id_ob=ok.id_ob and od.id_wo=ok.id_wo

et le deuxième plus grand (BAR) :

select o.id_we,o.id_b,o.id_wo, o.rdata,o.rsize
from (select id_we,id_b,id_wo,rdata from odczyty
where rdata =(select max(rdata)
from odczyty o2
where o2.id_we=odczyty.id_we and o2.id_b=odczyty.id_b
and o2.id_wo=odczyty.id_wo and
rdata <(select max(rdata) from odczyty o3
where o3.id_we=o2.id_we and
o3.id_b=o2.id_b and o3.id_wo=o2.id_wo))) as x
inner join odczyty o on o.id_we=x.id_we and o.id_b=x.id_b and o.id_wo=x.id_wo and o.rdata=x.rdata

En utilisant ces deux requêtes, j'ai fait ceci :

   select od.id_wej,od.id_ob,od.id_wo, ok.odata-od.odata as days,ok.od-od.od as dif
from(BAR)as od  inner join
(FOO)as ok
on od.id_wej=ok.id_wej and od.id_ob=ok.id_ob and od.id_wo=ok.id_wo
order by id_wej, id_ob, id_wo

J'ai remplacé les requêtes insérées par FOO et BAR pour des raisons de lisibilité.

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