Nous avons des données qui ressemblent à ceci:

***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

Je veux obtenir listing_id, la durée (max_date - min_date) pour laquelle il est répertorié au cas où il serait vendu.

Comment obtenir ces résultats lorsque mon magasin de données est un serveur MS SQL?

-2
Vineel 16 janv. 2017 à 15:06

2 réponses

Meilleure réponse

GROUP BY et DATEDIFF avec quelques CASE devraient faire

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
;

Vous pouvez utiliser ce qui suit si vous souhaitez obtenir la première date de vente

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

datediff(dd,....) différence de retour en jours. Pour plus d'informations, consultez this out

1
Gurwinder Singh 20 janv. 2017 à 03:18

Pas vraiment assez de détails dans votre question donc je suppose mais peut-être quelque chose comme;

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
Milney 16 janv. 2017 à 12:11