Вставка строк, которые не существуют и используют предыдущее значение - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь вставить строки, которых нет в таблице, из которой я получаю данные, она упорядочена по столбцу days_to_cancel и начинается с нуля с новой записью Год / Месяц.Я использую следующий запрос:

CREATE TABLE reporting.tbl_exec_retention_curve_cumulative (days_to_cancel int, cancels int, cumulative_cancels int, enroll_dt varchar(50));
SELECT rc.days_to_cancel,
       rc.cancels,
       (@run_total := CASE WHEN rc.days_to_cancel <> 0 THEN @run_total + 
       rc.cancels ELSE rc.cancels END) AS cumulative_cancels,
       LEFT(rc.client_enroll_dt,7) AS client_enroll_dt
FROM   (SELECT rc.days_to_cancel,
               SUM(CASE WHEN rc.client_status = 'CAN' THEN 1 ELSE 0 END) AS cancels,
               LEFT(rc.client_enroll_dt,7) AS client_enroll_dt
        FROM   t1.table rc
        GROUP BY 1,3
        ORDER BY 3,1
        ) rc
JOIN    (SELECT @run_total := 0) r
GROUP BY 1,4
ORDER BY 4,1;

Я получаю пример результата следующего

days_to_cancel | cancels | cumulative_cancels | client_enroll_dt
---------------+---------+--------------------+------------------
       42      |    2    |         376        |     2019-02
       47      |    0    |         376        |     2019-02
       0       |    0    |         0          |     2019-03
       10      |    4    |         4          |     2019-03
       11      |    9    |         13         |     2019-03

Поэтому моя цель - ввести пропущенные дни и использовать предыдущие значения cumulative_cancels и enroll_dtи 0 для столбца отмены при вводе этой новой строки для этих пропущенных дней.Я пробовал несколько способов, включая использование переменных, но я не знаю, что делать.Я не знаю, возможно ли это, учитывая, что строки никогда не существовали.Если это имеет значение, я нахожусь на версии 10.0.35 MariaDB.

1 Ответ

0 голосов
/ 21 марта 2019

Я просто представляю, что вы извлекли данные из t1.table и хотите вставить свой результат в ту же таблицу.

Мое решение - поместить ваш результат во временную таблицу, а затем найти пропущенные дни по левому соединению.

SELECT rc.days_to_cancel,
       rc.cancels,
       (@run_total := CASE WHEN rc.days_to_cancel <> 0 THEN @run_total + 
       rc.cancels ELSE rc.cancels END) AS cumulative_cancels,
       LEFT(rc.client_enroll_dt,7) AS client_enroll_dt
--put your result into a temp table
into #temp
FROM   (SELECT rc.days_to_cancel,
               SUM(CASE WHEN rc.client_status = 'CAN' THEN 1 ELSE 0 END) AS cancels,
               LEFT(rc.client_enroll_dt,7) AS client_enroll_dt
        FROM   t1.table rc
        GROUP BY 1,3
        ORDER BY 3,1
        ) rc
JOIN    (SELECT @run_total := 0) r
GROUP BY 1,4
ORDER BY 4,1;


insert into t1.table (days_to_cancel, cancels,cumulative_cancels, client_enroll_dt)
select tm.days_to_cancel, tm.cancels, tm.cumulative_cancels, tm.client_enroll_d from #temp tm
left join t1.table rc on rc.days_to_cancel = tm.days_to_cancel
where rc.days_to_cancel is null --find out missing days

drop table #temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...