Подсчитать все строки, которые соответствуют условию за данный месяц - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужно сделать запрос SQLite для чего-то, что я просто не могу обернуть вокруг себя.

У меня есть таблица базы данных с кучей "проблем". И у каждой «проблемы» есть дата создания и дата разрешения.

id        createddate     resolutiondate
-------------------------------------------
1          2019-04-18      2019-08-18
2          2019-04-20      2019-04-21
3          2019-05-08      2019-06-05
etc....

Что мне нужно сделать, так это подсчитать, сколько «проблем» в каждом месяце за последние 12 месяцев имело дату создания <= того месяца и где дата принятия решения -> тот месяц. Мне нужна таблица, которая выглядит следующим образом:

Month         No. Of Issues Not Resolved But Existed That Month
---------------------------------------------------------------
2019-04       20
2019-05       17
2019-06       15
etc...

Я изо всех сил, потому что мне по сути нужно проверять каждую строку несколько раз, для каждого месяца его созданная дата <= этот месяц, и это не ' еще не решен. Например, подсчет для конкретной проблемы может увеличить значение «Количество проблем» как для апреля 2019 года, так и для мая 2019 года, если он не был решен в течение 2 месяцев. Я не уверен, как проверить все строки несколько раз. </p>

Я должен сделать это в SQLite.

Моя текущая попытка, которая, кажется, не работает:

SELECT * FROM(
SELECT substr(createddate, 1, 7) AS created
FROM {{ project_key }}
GROUP BY substr(createddate, 1, 7)
) a JOIN (
    SELECT  substr(createddate, 1, 7) AS created,
            COUNT(CASE WHEN julianday(substr(resolutiondate, 1, 10)) >= julianday(substr(created, 1, 10)) THEN 1 ELSE NULL END) as "No. Issues Not Resolved"
    FROM {{ project_key }}
    GROUP BY substr(createddate, 1, 7)
) b ON b.created = a.created

1 Ответ

1 голос
/ 20 февраля 2020

С рекурсивным CTE, который возвращает последние 12 месяцев, и left join к таблице:

with months as (
  select strftime('%Y-%m', 'now', '-1 year') month
  union all 
  select strftime('%Y-%m', strftime('%Y-%m-%d', month || '-01', '+1 month') )
  from months 
  where month < strftime('%Y-%m', 'now', '-1 month')
)   
select m.month, 
  count(id) [No. Of Issues Not Resolved But Existed That Month] 
from months m left join tablename t
on strftime('%Y-%m', t.createddate) <= m.month and strftime('%Y-%m', t.resolutiondate) > m.month
group by m.month

См. Демоверсию . Результаты:

| month   | No. Of Issues Not Resolved But Existed That Month |
| ------- | ------------------------------------------------- |
| 2019-02 | 0                                                 |
| 2019-03 | 0                                                 |
| 2019-04 | 1                                                 |
| 2019-05 | 2                                                 |
| 2019-06 | 1                                                 |
| 2019-07 | 1                                                 |
| 2019-08 | 0                                                 |
| 2019-09 | 0                                                 |
| 2019-10 | 0                                                 |
| 2019-11 | 0                                                 |
| 2019-12 | 0                                                 |
| 2020-01 | 0                                                 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...