2016-06-05 5 views
0

Мне нужно посчитать людей, у которых текущий статус 3, а у предыдущего статуса не 2 для каждого месяца. SQL, как показано ниже:SQL Server 2008: КАК ПОЛУЧИТЬ ПРЕДЫДУЩИЙ СТАТУС

SELECT 
    MONTH, 
    COUNT(PERSON_ID) AS COUNT 
FROM 
    STATUS S 
WHERE 
    STATUS = 3 AND 'PREVIOUS_STATUS' <> 2 
GROUP BY 
    MONTH 

Мой вопрос: может кто-нибудь сказать мне, как писать SQL часть, чтобы получить «PREVIOUS_STATUS» для тех людей, с текущим статусом = 3? Благодаря!

Структура для таблицы состояния:

Person_ID   Status  Month 
    ------------------------------------------- 
    101     1   07/15 
    101     2   09/15 
    101     3   12/15 
    102     1   02/15 
    102     3   05/15 
    103     1   03/16 
    ...     ...   ... 
+2

Какой тип является 'MONTH' поле? – melpomene

+2

ПОЧЕМУ ТЫ СКРИМИНГ НА МЕНЯ? Я НЕ СДЕЛАЛ НИЧЕГО! –

+2

нет, серьезно, не навредил, но немного некорректно использовать Caps Lock для обычного текста. –

ответ

2

Если month хранится в приемлемом формате, вы можете использовать outer apply:

select month, count(*) 
from status s outer apply 
    (select top 1 s2.* 
     from status s2 
     where s.person_id = s2.person_id and s2.month < s.month 
     order by s2.month desc 
    ) as sprev 
where s.status = 3 and (sprev.status is null or sprev.status = 2) 
group by month; 
+0

Благодарим за быстрый ответ! – Ice

+0

sql получил мне данные за все месяцы. Как я могу получить данные для определенных временных рамок, например, '07/2015 'до '06/2016'? Благодаря! – Ice

+1

@Ice. , , Вы должны добавить предложение 'where' во внешний запрос. –

Смежные вопросы