2016-07-01 12 views
2

Ich habe Tabelle wie dieWie wähle ich die ersten beiden Zeilen jeder Gruppe aus und zähle die Differenz zwischen ihnen in einer Spalte?

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 und ID_WO zusammen Primärschlüssel sind. Für jede Kombination id-wir, id_b gibt es wenige ID_WO. Jeder ID_WO haben viel liest, Informationen über liest in RDATA und RSIZE

Ich brauche Tisch zu holen, wie die

ID_WE ID_B ID_WO DAYS DIF 
11111 22  1  1  0 

DIF ist der Unterschied in RSIZE zwischen zwei zuletzt für gegebene ID_WO liest, DAYS ist Wie viele Tage sind zwischen zwei letzten Lesezeiten verstrichen

Es braucht wahrscheinlich eine Gruppe von und vielleicht max (rdata), um die Differenz in Tagen und Größe zu zählen. Ich bin wirklich verloren, wie man so ein Ergebnis bekommt. Ich werde alle Tipps schätzen, wie Sie die gewünschten Ergebnisse erhalten.

+5

ID_WE und ID_B zusammen können nicht der Primärschlüssel sein, da es solche Duplikate gibt. – jarlh

+0

Welche Firebird Version? Mit Firebird 3 ist es wahrscheinlich einfacher als mit früheren Versionen. BTW: Ich verstehe die Beispieldaten nicht, warum "DAYS" einen Wert von 780 und "DIF" einen Wert von 6 haben. –

+0

@Mark Rotteveel- Fierbird 2.1, und du hast recht, es sollte 1 Tag und sein 0 dif – Majlena

Antwort

0

Vielen Dank für Kommentare und Antworten, die mich auf der rechten Spur bekommen haben von Denken. Ich habe es endlich herausgefunden. Mit Hilfe von this page auf Baron Schwartz's Blog (es ist nützliche Ressource, wenn jemand die erste/kleinste/maximale Zeile pro Gruppe in SQL auswählen muss).

ich die grösste und seconde Bigest RDATA und coresponding RSIZE in Abfrage wie das, größte (FOO), um Daten hinzuzufügen:

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 

und zweitgrößte (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 

Verwendung diese zwei Abfragen habe ich das gemacht:

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 

ich ersetzte Inser ted Abfragen mit FOO und BAR für die Lesbarkeit.

1

Versuchen Sie, diese

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 
+0

Schließen, aber MAX (RDATA) -Min (RDATA) Tage geben meine Differenz zwischen ersten und letzten, und ich brauche die letzten zwei. Mehr wie MAX (RDATA) -Max2 (RDATA) DAYS.Where Max2 ist zweitgrößter. – Majlena

+0

Können Sie die Abfrage in SQL Fiddle bereitstellen –

1

Statt TABLE1 i in etwas zu bekommen die beiden letzten Elemente bauen:

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; 
Verwandte Themen