2017-10-13 21 views
0

ロードブロッキングを打ったことがあります。最初に特定の番号に達した行を返す(ポストグル)

コンテキストは次のように顧客のポイントが未収と私は​​、テーブルを持っているのPostgreSQL 9.5.8

を使用しています。表には、顧客ごとに複数の行があります(イベント表など)。すなわち、顧客1は1つのアイテムを購入し、1つの行である10ポイントを獲得し、次に別の日にこれらのポイントのいくつかを費やし、別の行である5ポイントを残してから別のアイテムを購入し、他の行として表示される15までです。小数点以下の行にはそれぞれcreated_atの列があります。

例表:

Customer ID created_at no_points row 
123   17/09/2017 5   1 
123   09/10/2017 8   2 
124   10/10/2017 12   3 
123   10/10/2017 15   4 
125   12/10/2017 12   5 
126   17/09/2017 6   6 
123   11/10/2017 11   7 
123   12/10/2017 9   8 
127   17/09/2017 5   9 
124   11/10/2017 5   10 
125   13/10/2017 5   11 
123   13/10/2017 12   12 

Iは、顧客が特定の閾値、すなわち> = 10ポイントに到達する最初の時間を追跡します。 10ポイントを超えているかどうかは関係ありませんが、唯一の基準は最初にの時間を顧客がこのしきい値に達するまで選択することです。このクエリで行だけを取得して、先週のの顧客がしきい値10に達した行をに取得したいとします。

SELECT x.id, 
     min(x.created_at) 

FROM (

SELECT 
     p.id as id, 
     p.created_at as created_at, 
     p.amount as amount 

FROM "points" p 

WHERE p.amount >= 10 ) x 

WHERE x.created_at >= (now()::date - 7) 
AND x.created_at < now()::date 

GROUP BY x.id 

私はわからないよ:

これらの規則に続いて、上記の例では、私は次のクエリを試してみました3、4と5

行を選択するには、私のクエリをしたいと思います私は結果セットが曖昧なので、結果セットが&であることがわかっている結果セットから正しいものを検索しています。誰かがチェックをすることができますか?

ありがとうございます。

答えて

0

利用累積機能:

select p.* 
from (select p.*, 
      sum(num_points) over (partition by p.customer_id order by p.created_at) as cume_num_points 
     from points p 
    ) p 
where cume_num_points >= 10 and 
     (cume_num_points - num_points) < 10; 

EDIT:

私は質問を誤解している可能性があります。

select p.* 
from (select p.*, 
      lag(num_points) over (partition by p.customer_id order by p.created_at) as prev_num_points 
     from points p 
    ) p 
where num_points >= 10 and 
     prev_num_points < 10; 

または、サブクエリなし::

select distinct on (p.customer_id) p.* 
from customers p 
where num_points >= 10 
order by p.customer_id, p.created_at; 
あなただけの最初の休憩をしたい場合は、1つの方法は、ウィンドウ関数を使用しています
関連する問題