Мне нужно подсчитать последние несколько месяцев, когда участник имел статус D.
Например, у меня есть таблица ниже, где у меня есть месяцы с февраля по август для 2 участников.
год месяц | ID пользователя | статус |
---|---|---|
2020_02 | 1010 | Д |
2020_03 | 1010 | Д |
2020_04 | 1010 | Д |
2020_05 | 1010 | А |
2020_06 | 1010 | А |
2020_07 | 1010 | Д |
2020_08 | 1010 | Д |
2020_02 | 1030 | А |
2020_03 | 1030 | А |
2020_04 | 1030 | А |
2020_05 | 1030 | Д |
2020_06 | 1030 | А |
2020_07 | 1030 | А |
2020_08 | 1030 | Д |
Мне нужно подсчитать количество месяцев, в течение которых участник находился в статусе D подряд. В этом примере ожидаемый результат будет следующим:
ID пользователя | состояние счета D |
---|---|
1010 | 2 |
1030 | 1 |
Для участника 1010 мне нужно считать июль и август, потому что в июне у него был статус А.
Кто-нибудь может мне помочь?
Я новичок, и я понятия не имею, как я могу это сделать.
С SQL вы можете использовать, например:
SELECT COUNT(DISTINCT member_ID) AS member_ID FROM Table WHERE Status = D;
Для получения дополнительной информации: http://www-db.deis.unibo.it/courses/TW/DOCS/w3schools/sql/sql_func_count.asp.html
Ваш ответ не сработает, и это не вопрос для новичков.
Мы можем попробовать сначала отфильтровать для каждого участника только последние D
записи. Затем агрегируйте по членам и найдите количество.
SELECT member_id, COUNT(*) AS count_status_D
FROM
(
SELECT member_id
FROM yourTable t1
WHERE status = 'D' AND
NOT EXISTS (SELECT 1
FROM yourTable t2
WHERE t2.member_id = t1.member_id AND
t2.year_month > t1.year_month AND
t2.status <> 'D')
) t
GROUP BY member_id;
это сработало именно так, как ожидалось, большое спасибо, Тим!
Какие СУБД вы используете?