2017-04-02 5 views
0

Abfrage über habe ich eine Funktion, die Ebene Lager gibt:mehr Daten aus der Funktion in PostgreSQL

select * from stocklevel(ID) 

Diese Funktion Lager leverl pro ID gibt. Zum Beispiel:

select * from stocklevel(23) 

Ergebnis ist:

ID datelevel stocklevel 
    23 01.01.17 15 
    23 02.01.17 18 
    23 05.01.17 20 

Dies ist der Lagerbestand für ID=23.

Nicht alle Daten erscheinen, es hängt von vielen Dingen ab.

Ich möchte diese Funktion verwenden, um die Lagerbestände für alle Teile von meinem System

im Grunde so etwas zu bekommen:

select *,(select stocklevel from stocklevel(parts.partid) where datelevel = ???) 
from parts 

OR:

select * 
    from parts 
    left join (select stocklevel from stocklevel(parts.partid) where datelevel = ???) using (ID) 

Nun ist die Frage ist mit der WHERE Bedingung möchte ich ein bestimmtes Datum wie '04 .01.17 'angeben, aber wenn das Datum nicht existiert, möchte ich es das Datum vor dem so nehmen:

für die ID=23 und das Datum '04.01.17' sollte es 18, '02.01.17' zeigen.

für die ID=23 und das Datum '15.01.13' sollte es nichts zeigen.

für die ID=23 und das Datum '05.01.17' sollte es 20, '05.01.17' zeigen.

Wie kann ich das tun?

Antwort

1

Zuerst würde ich ein lateral beitreten:

select * 
from parts p left join lateral 
    stocklevel(p.partid); 

Dann wird das Problem ist, dass Sie die aktuellste Ebene wollen vor oder zu einem bestimmten Zeitpunkt. Sie können dies distinct on mit tun:

select distinct on (p.id) . . . 
from parts p left join lateral 
    stocklevel(p.partid) 
where datelevel <= ? 
order by p.id, datelevel desc; 

Hinweis: Dies wird nicht wieder Teile, die keine Daten vor dem angegebenen Datum haben. Vielleicht möchten:

where datelevel is null or datelevel <= ? 
+0

Ich bin mir nicht sicher, ob ich die Notiz verstehen ... Date nie null ist. Wenn das Datum übersprungen wurde, hat es keinen Eintrag. – avi

+0

@avi. . . Ich meine, wenn Ihr Datum früher ist als irgendein Lagerbestand für diesen Teil, dann wird das Teil nicht zurückgegeben. Der 'NULL' kommt von der äußeren Verknüpfung. –

+0

brauche ich nicht verwenden oder in der Join? – avi

0
select * 
    from parts 
    left join (select stocklevel 
     from stocklevel(parts.partid) 
     where datelevel = (select max(datelevel) 
      from stocklevel(parts.partid) sl2 
      where sl2.datelevel <= '04.01.17') using(ID)) using (ID) 

ungetestet ...

Verwandte Themen