2016-02-24 4 views
1

У меня есть данные за линейные месяцы, и вам нужно получить подсчет только за последние несколько месяцев. Например, если человек был членом клуба здоровья в течение первых двух месяцев 2014 года, а затем выбыл на 4 месяца, а затем подписался на оставшиеся 6 месяцев, мне нужно показать, что они были членами в течение 6 месяцев подряд.SQL Server - Сброс количества строк в окне

Вот данные запроса и таблицы, которые я использую, чтобы попытаться получить количество строк. YearMo отслеживает возможный список лет и месяцев. Столбец ismember отслеживает, были ли они членами или нет - 1 означает, что они являются членами, nc, за которым следует годовая стоимость (nc201403), указывает месяцы, когда они не были членами.

В столбце monthcount вы можете видеть, что row_number не распознает месяцы, когда они не были членами, он просто подбирает счет, как только они снова становятся членами. Вместо того, чтобы показывать 8 в качестве последней месячной отметки, мне нужно, чтобы она была равна 6, и счет был снова запущен в 20140 году (июль 2014 года).

SELECT member_id, YearMo, ismember, 
ROW_NUMBER() OVER(PARTITION BY member_id, ismember ORDER BY members.yearmo) AS 'monthcount' 
FROM #temp_members WHERE member_id = '12345678' ORDER BY yearmo 


member_id YearMo ismember monthcount 
12345678 201401 1    1 
12345678 201402 1    2 
12345678 201403 nm201403  1 
12345678 201404 nm201404  1 
12345678 201405 nm201405  1 
12345678 201406 nm201406  1 
12345678 201407 1   3 
12345678 201408 1   4 
12345678 201409 1   5 
12345678 201410 1   6 
12345678 201411 1   7 
12345678 201412 1   8 

Любые мысли о том, как получить мой счет сброса после перерыва в членстве, будут оценены! Также открываются способы сделать это без окна/раздела. (Нет курсоры Пожалуйста Шестнадцать миллионов записей, чтобы иметь дело с.)

+0

Что бы 'monthcount' для строк, которые не зарегистрированы? –

+0

Какова версия сервера sql, которую вы используете? – Squirrel

+0

SQL Server 2014. – mike

ответ

1

Используя разницу в ROW_NUMBER с:

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY member_id ORDER BY YearMo) 
      - ROW_NUMBER() OVER(PARTITION BY member_id, CASE WHEN ismember <> '1' THEN 0 ELSE 1 END ORDER BY YearMo) 
    FROM #temp_members 
) 
SELECT 
    member_id, 
    YearMo, 
    ismember, 
    monthcount = ROW_NUMBER() OVER(PARTITION BY member_id, rn, ismember ORDER BY YearMo) 
FROM Cte ORDER BY member_id, YearMo 

TRY IT HERE

+0

Прекрасно работает Феликс! Спасибо! – mike

+0

Рад помочь. Просьба принять этот ответ, если он решает вашу проблему. –

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