2017-08-15 48 views
1

我想從表中獲取上個月的記錄。我曾嘗試:選擇計數,而計數大於postgres中的特定數字sql

SELECT count(*) as numberOfRows from Table where created_at > CURRENT_DATE - INTERVAL '1 months' 

這是好的,但我想添加一些條件:

If numberOfRows >= 10, do nothing (numberOfRows can be 20, 30, ...)

else if numberOfRows < 10, select from this table until numberOfRows = 10 (last 2 months, 3 months, etc...).

我怎麼能這樣做? 感謝您的進步!

+0

你或你不想要一個多月前的記錄嗎?這點我不清楚。 –

+0

你的描述聽起來很沒用。爲什麼不直接返回'最大(count(*),10)'? –

回答

2
WITH curr_month_cnt AS (
    SELECT COUNT(*) AS cnt 
    FROM your_table 
    WHERE created_at > CURRENT_DATE - INTERVAL '1 months' 
) 

SELECT * 
FROM your_table 
WHERE created_at > CURRENT_DATE - INTERVAL '1 months' 
UNION ALL 
SELECT t.* 
FROM 
(
    SELECT * 
    FROM your_table 
    WHERE 
     created_at <= CURRENT_DATE - INTERVAL '1 months' AND 
     (SELECT cnt FROM curr_month_cnt) < 10 
    ORDER BY created_at desc 
    LIMIT 
     GREATEST(0, 10 - (SELECT cnt FROM curr_month_cnt)) 
) t 

這將最多返回10條記錄,從最近一個月和倒退。如果最近一個月沒有10條記錄,那麼將按照該順序返回兩個和三個月的數據。

+0

對不起,我的描述不夠清楚。 我想在最近一個月得到所有記錄。如果最近一個月的事件沒有10條記錄,則會倒退,直到獲得足夠的10條記錄。否則,如果最近一個月的事件記錄大於10,則會獲得所有這些記錄。行數是20,30也可以。 – javimuu

+0

@javimuu我更新了我的答案,你可以再試一次嗎? –

+0

它就像一個魅力!謝謝! – javimuu

0

根據您的描述,你似乎想:​​

select greatest(10, count(*)) as numberOfRows 
from Table 
where created_at > CURRENT_DATE - INTERVAL '1 months'; 

這似乎是相當令人吃驚。也許你想:

select (case when sum((CURRENT_DATE - INTERVAL '1 months') :: int) >= 10 
      then sum((CURRENT_DATE - INTERVAL '1 months') :: int) 
      else least(10, count(*)) 
     end) as numberOfRows 
from Table 
where created_at > CURRENT_DATE - INTERVAL '1 months'; 
+0

謝謝你回答我的問題。 發生了錯誤: ''' 錯誤:無法將時間戳類型轉換爲無整數時間段 LINE 1:... e WHEN SUM((CURRENT_DATE - INTERVAL'1 months'):: int)> = .. ''' 我該怎麼辦? – javimuu