Использовать предыдущее значение из предыдущих строк для нулей в SQL - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь заполнить все нулевые значения предыдущим значением, но при условии, что поле учетной записи совпадает. Я узнал, что мой стол должен иметь первичный ключ. На данный момент у меня его нет на столе, и можно ли его создать, используя количество строк в таблице, см. Таблицу ниже:

CREATE TABLE test (ACCOUNT_NO INT, RATE INT, DATE_L DATE, ROWCOUNT INT);    
   INSERT INTO test VALUES (1, 3, '2017-12-31',1);
   INSERT INTO test VALUES (1, NULL, '2018-01-31',2);
   INSERT INTO test VALUES (3, 5, '2017-12-31',3);
   INSERT INTO test VALUES (3, NULL, '2018-01-31',4);
   INSERT INTO test VALUES (3, NULL, '2018-02-28',5);
   INSERT INTO test VALUES (6, 2, '2018-03-04',6);
   INSERT INTO test VALUES (6, NULL, '2018-03-04',7);
   INSERT INTO test VALUES (6, 5, '2018-03-04',8);
   INSERT INTO test VALUES (6, NULL, '2018-03-04',9);
   INSERT INTO test VALUES (6, NULL, '2018-03-04',10);

Итак, таблица выглядит так:

|ACCOUNT_NO|RATE|DATE_L    |RowCount|
|1         |3   |2017-12-31|1       |
|1         |NULL|2018-01-31|2       |
|3         |5   |2017-12-31|3       |
|3         |NULL|2018-01-31|4       |
|3         |NULL|2018-02-28|5       |
|6         |2   |2018-03-04|6       |
|6         |NULL|2018-03-04|7       |
|6         |5   |2018-03-04|8       |
|6         |NULL|2018-03-04|9       |
|6         |NULL|2018-03-04|10      |

И я хочу, чтобы это выглядело так:

|ACCOUNT_NO|RATE|DATE_L    |RowCount|
|1         |3   |2017-12-31|1       |
|1         |3   |2018-01-31|2       |
|3         |5   |2017-12-31|3       |
|3         |5   |2018-01-31|4       |
|3         |5   |2018-02-28|5       |
|6         |2   |2018-03-04|6       |
|6         |2   |2018-03-04|7       |
|6         |5   |2018-03-04|8       |
|6         |5   |2018-03-04|9       |
|6         |5   |2018-03-04|10      |

Любая помощь приветствуется и заранее благодарим.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Как отредактировано в вопросе позже, столбец ROWCOUNT будет использоваться для определения «предыдущего / последнего ряда».Основная предпосылка заключается в том, что более низкое значение ROWCOUNT означает «старый / предыдущий» ряд.

Затем можно использовать Коррелированный подзапрос с условными CASE .. WHEN выражениями для определения последнего значения NON NULL для того же ACCOUNT_NO:

Запрос

SELECT
  t1.ACCOUNT_NO, 
  CASE WHEN t1.RATE IS NULL 
         THEN (SELECT t2.RATE 
               FROM test AS t2 
               WHERE t2.ROWCOUNT < t1.ROWCOUNT AND 
                     t2.ACCOUNT_NO = t1.ACCOUNT_NO AND 
                     t2.RATE IS NOT NULL 
               ORDER BY t2.ROWCOUNT DESC 
               LIMIT 1)
       ELSE t1.RATE
  END AS RATE, 
  t1.DATE_L, 
  t1.ROWCOUNT 
FROM test AS t1;

Результат

| ACCOUNT_NO | DATE_L     | ROWCOUNT | RATE |
| ---------- | ---------- | -------- | ---- |
| 1          | 2017-12-31 | 1        | 3    |
| 1          | 2018-01-31 | 2        | 3    |
| 3          | 2017-12-31 | 3        | 5    |
| 3          | 2018-01-31 | 4        | 5    |
| 3          | 2018-02-28 | 5        | 5    |
| 6          | 2018-03-04 | 6        | 2    |
| 6          | 2018-03-04 | 7        | 2    |
| 6          | 2018-03-04 | 8        | 5    |
| 6          | 2018-03-04 | 9        | 5    |
| 6          | 2018-03-04 | 10       | 5    |

Просмотр на БД Fiddle

0 голосов
/ 16 ноября 2018

Используйте ниже простой запрос.Вы можете получить ожидаемый результат.

UPDATE test AS t1
INNER JOIN 
    (SELECT ACCOUNT_NO, RATE FROM test WHERE RATE !='' GROUP BY ACCOUNT_NO) AS t2 ON t1.ACCOUNT_NO=t2.ACCOUNT_NO
SET t1.RATE=t2.RATE
WHERE t1.RATE IS NULL OR t1.RATE = ''
0 голосов
/ 16 ноября 2018

Ваша проблема, по-видимому, основана не на предыдущих значениях, а на значениях, отличных от NULL для тех же account_no.

update test t join
       (select account_no, max(rate) as max_rate
        from test t
        group by account_no
       ) a
       using (account_no)
    set t.rate = a.max_rate
    where t.rate is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...