Как посчитать последние записи данного статуса?

Мне нужно подсчитать последние несколько месяцев, когда участник имел статус D.

Например, у меня есть таблица ниже, где у меня есть месяцы с февраля по август для 2 участников.

год месяцID пользователястатус
2020_021010Д
2020_031010Д
2020_041010Д
2020_051010А
2020_061010А
2020_071010Д
2020_081010Д
2020_021030А
2020_031030А
2020_041030А
2020_051030Д
2020_061030А
2020_071030А
2020_081030Д

Мне нужно подсчитать количество месяцев, в течение которых участник находился в статусе D подряд. В этом примере ожидаемый результат будет следующим:

ID пользователясостояние счета D
10102
10301

Для участника 1010 мне нужно считать июль и август, потому что в июне у него был статус А.

Кто-нибудь может мне помочь?

Я новичок, и я понятия не имею, как я могу это сделать.

Какие СУБД вы используете?

jarlh 04.04.2022 11:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

С 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

Ваш ответ не сработает, и это не вопрос для новичков.

Tim Biegeleisen 04.04.2022 11:22
Ответ принят как подходящий

Мы можем попробовать сначала отфильтровать для каждого участника только последние 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;

это сработало именно так, как ожидалось, большое спасибо, Тим!

Vinícius Faria 05.04.2022 10:31

Другие вопросы по теме