2017-10-09 16 views
1

テーブルopportunities upsellのエンティティであるかどうかを確認しようとしています。ある企業が複数の機会(1:N)を持つことができ、機会が企業とのつながりを持ち、過去に他の機会がすでに同じ企業とのビジネスを成功裏に終えている(したがってstatusが7)場合は、言い換えれば、ステータス7の最初の機会はアップセルではなく、同じ会社の他のすべての人は、そのステータスに関係なくアップセルされます。GROUP BYの正当な使用

だから、これはここでの考え方は、副選択で(created_at列に基づいて)全ての第1正常に終了機会を選択し、同じ会社を持っているすべての機会からそれらを削除することです、私は

SELECT opportunities.id ,true as upsell FROM opportunities, (
    SELECT companies.id as company_id, opportunities.id as opportunity_id 
    FROM opportunities 
    JOIN companies ON companies.id = opportunities.company_id 
    WHERE opportunities.status = 7 
    GROUP BY companies.id, opportunities.id 
    HAVING min(opportunities.created_at) = opportunities.created_at) 
AS subs WHERE subs.opportunity_id = opportunities.id 

を試してみたものです。しかし、副選択さえ正しく動作しない場合は、status = 7でフィルタリングされたすべての機会が返されるので、私はおそらくgroup by節を誤解しています。 -

+0

サンプルデータと希望の再うんざりが本当に助けになるでしょう。 –

+0

私は試してみるよ、 –

答えて

1

私が正しく理解していれば、あなたはopportunitiesのときのように真のタグを付けることにしたい。それは場合は、会社

のための最初のレコードではありません

  • 状態= 7
  • だから私はこれがはるかに簡単だと思う:

    select o.*, 
         (row_number() over (partition by o.company_id, o.status 
              order by created_at 
             ) > 1 or 
         status <> 7 
         ) as upsell_flag 
    from opportunities o; 
    
+0

正しいと思うが、今はもっと徹底的にテストするつもりだ。ありがとう、分割はまだ私にとって魔法です: -/ –

+0

Btwの第2条件は正しいですが、最初は少し異なります - 最初のステータスは7(偽とタグ付けされている)でなければなりません。残りの状態は問題ではありません。アップセルは、最初の成功した売却(状態7)後に会社に接続されたすべての機会に当てはまります。それはすでに肯定的な記録を持つ誰かと継続的なビジネスについてです –

+0

あなたを混乱させて申し訳ありません、私はそれを説明することは容易ではないことに気づいた:) –