2017-04-02 53 views
0

我有一個函數,使庫存水平:查詢了從功能多數據PostgreSQL中

select * from stocklevel(ID) 

這個功能讓每個ID股票操縱桿。 例如:

select * from stocklevel(23) 

結果是:

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

這是庫存水平的ID=23

並非所有的日期都出現,它取決於很多事情。

我想要使用此功能,從我的系統獲得的庫存水平爲各地

基本上是這樣的:

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) 

現在,這個問題是與WHERE條件我想具體的日期,如'04.01.17',但如果日期不存在,我希望它採取之前的日期如此:

對於ID=23和日期'04.01.17'它應該顯示18,'02.01.17'

ID=23和日期'15.01.13'它應該什麼都不顯示。

ID=23和日期'05.01.17'它應該顯示20,'05.01.17'

我該怎麼做?

回答

1

首先,我會用一個lateral加入:

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

那麼問題是,你想之前或在某一特定日期的最新水平。您可以使用distinct on做到這一點:

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

注意:這不會返回具有給定的日期之前沒有日期部分。你可能會想:

where datelevel is null or datelevel <= ? 
+0

我不知道我理解的音符...... datelevel永遠不能爲null。如果跳過日期,則不會有記錄。 – avi

+0

@avi。 。 。我的意思是,如果您的日期早於該部分的任何庫存水平,那麼該部分將不會退回。 'NULL'來自外連接。 –

+0

我不需要在連接中使用或打開嗎? – 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) 

未經測試...