2017-01-16 121 views
-2

我們有一些數據,看起來像這樣:Perfoming SQL查詢或存儲過程?

***listing_id,log_date,event*** 
2112,<date>,stage_1 
2112,<date>,stage_2 
2112,<date>,sold 
2113,<date>,stage_1 
2113,<date>,stage_6 
2114,<date>,stage_1 
2114,<date>,sold 

我想listing_id,持續時間 - 爲它在它的銷售的情況下,上市(MAX_DATE MIN_DATE)。

當我的數據存儲是MS SQL服務器時,如何實現這些reuslts?

+3

請在發佈問題前查看[問]和[mcve]。諸如「如何做到這一點」等問題沒有顯示任何嘗試或努力,通常不受歡迎。 – Aleksej

回答

1

GROUP BY和DATEDIFF有少數病例沿着應該做

select 
    listing_id, 
    datediff(dd, min(log_date), 
     case 
      when count(case when event = 'sold' then 1 end) > 0 then 
       max(case when event = 'sold' then log_date end) 
      else 
       max(log_date) 
     end 
    ) duration, 
    case 
     when count(case when event = 'sold' then 1 end) > 0 then 
      'Yes' 
     else 
      'No' 
    end was_sold 
from your_table 
group by 
    listing_id 
; 

,如果你想要得到的最早出售日期天

min(case when event = 'sold' then log_date end) 

datediff(dd,....)回差可以使用以下。欲瞭解更多信息,請檢查this out

+0

非常感謝您的回覆。但是還有兩個小要求:1)我想要有狀態欄(不管是否存在「已售出」)。2)如果已售出,我想考慮售出行中的日期作爲最大日期,不必是全球最大。請考慮。 – user4654

+1

@ user4654 - 已更新。你可以試試嗎? – GurV

+0

讓我現在就試試。 – user4654

0

在你的問題中沒有足夠的細節,所以我猜測,但可能是類似的;

SELECT 
    listing_id, 
    MIN(log_date) AS Start, 
    MAX(log_date) AS Finish, 
    datediff(day, MIN(log_date), MAX(log_date) AS Duration 
FROM YourTable 
GROUP BY 
    listing_id 
+0

感謝您的回覆。讓我澄清一下。 1)「已售出」可能會或可能不會發生上市。 2)如果沒有發生,我們只需要最小和最大日期之間的差異。 3)如果出現「已售出」,則可能出現在最後一步或中間步驟。如果它的中間步驟,我們只是想考慮中間步驟的日期作爲最大日期。 – user4654