2017-08-15 18 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

あなたは1ヶ月以上前のレコードを希望しますか?これは私には分かりません。 –

+0

あなたの説明はかなり役に立たないと思います。なぜ、「最大(カウント(*)、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件のレコードがない場合は、2〜3か月前のデータがこの順番で返されます。

+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いつSUM( 。 '' ' どうすればいいですか? – javimuu

関連する問題