2017-03-21 36 views
0

我有以下看法:使用計算的情況下,在結果中的PostgreSQL

CREATE OR REPLACE VIEW view_a AS 
SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) AS months_between 

       <24 then months_between::integer else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

這種觀點需要createdate(每partid最早記錄的創建日期的時間戳),並計算自該日起幾個月過去了到NOW()一樣做here 如果結果小於24(個月)我想這個結果,否則我想24

這目前沒有工作,不接受的情況下中間的AS months_between

我該怎麼做?

編輯:

例如這個查詢工作:

SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) 
       <24 then 5 else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

但是它會返回5或24,這不是我想要的。我希望它返回CASE中計算的值。

爲了簡化問題,基本形式是:

case when calculated_value < 24 then calculated_value else 24 end; 

我希望能夠到的情況下返回calculated_value。

+0

你不能在這裏使用LEAST嗎?請參閱https://www.postgresql.org/docs/8.1/static/functions-conditional.html#AEN12704 –

+0

@RC。至少不是問題。查看編輯。 – avi

+0

然後,只需複製粘貼計算你的THEN ... ELSE –

回答

1

你可以嘗試MONTHS_BETWEEN計算移到common table expression(具有查詢),像這樣:

WITH timeframe_table AS (
    SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
    FROM age(NOW(), LEAST(pp.createdate)) AS months_between 
) SELECT 
    CASE when months_between< 24 then months_between else 24 as timeframe 
     FROM ..., timeframe_table 
     WHERE... 

您可能需要添加一些id字段來timeframe_table有一些加盟條件與表。

+0

你能提供更多關於你的查詢和「where」條件的信息嗎? –

+0

您仍然可以添加DISTINCT,您可以在WITH子句中移動WHERE條件。但是,我需要更多詳細信息來幫助解決您遇到的問題。 –

相關問題