2017-10-09 80 views
1

我想說的是,從表opportunities的實體是否可以追加或不追加。一個公司可以有多個機會(1:N),並且當機會與公司有聯繫並且過去有一些其他機會已經成功完成業務(因此status爲7)與同一個公司有聯繫時向上銷售是真實的。換句話說,第一個狀態爲7的機會不是向上銷售,不管他們的狀態如何,所有其他同一公司的銷售機會都是向上銷售的。正確使用GROUP BY

原來這就是我試過

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 

理念這裏是選擇在子查詢中的所有第一圓滿結束的機會(基於created_at列),然後從誰的同一家公司的機會將其刪除。但是,即使子選擇無法正常工作,它也會返回由status = 7過濾的所有機會,所以我可能誤解了group by子句。 -

+0

樣本數據和期望的重新sults真的會有所幫助。 –

+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

順便提一下,第二個條件是正確的,但第一個是有點不同的 - 第一個狀態必須是7(標記爲false的狀態)。其餘的狀態並不重要。 Upsell對於在第一次成功銷售之後連接到公司的所有機會(狀態7)是正確的。這是關於與已經有積極的記錄的人繼續生意 –

+0

抱歉讓你困惑,我意識到這是不容易的解釋:) –