Значение по умолчанию для функции LAG в MariaDB - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь создать представление, которое позволяет мне отслеживать разницу между оплаченными значениями в двух последовательных месяцах_иде.Однако, когда фигура отсутствует, это может быть связано с тем, что она является первой записью и, следовательно, имеет оплаченную сумму 0. В настоящее время я использую приведенное ниже для представления предыдущего рисунка, поскольку аргумент [,default] не был реализован в MariaDB..

CASE WHEN (
    NOT(policy_agent_month.policy_agent_month_id IS NOT NULL        
    AND LAG(days_paid, 1) OVER (PARTITION BY claim_id ORDER BY month_id ) IS NULL)) THEN        
         LAG(days_paid, 1) OVER ( PARTITION BY claim_id ORDER BY month_id)        
    ELSE 
         0        
    END

Проблема, с которой я столкнулся, заключается в том, что у меня есть около 30 переменных, к которым нужно применить эту функцию, и это делает мой код нечитаемым и очень неуклюжим.Есть ли лучшее решение?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Зачем использовать WITH?

SELECT province, tot_pop,
       tot_pop - COALESCE(
              (LAG(tot_pop) OVER (ORDER BY tot_pop ASC)),
                        0) AS delta
    FROM provinces
    ORDER BY tot_pop asc;

+---------------------------+----------+---------+
| province                  | tot_pop  | delta   |
+---------------------------+----------+---------+
| Nunavut                   |    14585 |   14585 |
| Yukon                     |    21304 |    6719 |
| Northwest Territories     |    24571 |    3267 |
| Prince Edward Island      |    63071 |   38500 |
| Newfoundland and Labrador |   100761 |   37690 |
| New Brunswick             |   332715 |  231954 |
| Nova Scotia               |   471284 |  138569 |
| Saskatchewan              |   622467 |  151183 |
| Manitoba                  |   772672 |  150205 |
| Alberta                   |  2481213 | 1708541 |
| British Columbia          |  3287519 |  806306 |
| Quebec                    |  5321098 | 2033579 |
| Ontario                   | 10071458 | 4750360 |
+---------------------------+----------+---------+
13 rows in set (0.00 sec)

Однако, это не дешево (по крайней мере, в MySQL 8.0); в таблице 13 строк, но

FLUSH STATUS;
SELECT ...
SHOW SESSION STATUS LIKE 'Handler%';
MySQL 8.0:
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_read_rnd           | 89    |
| Handler_read_rnd_next      | 52    |
| Handler_write              | 26    |
  (and others)

MariaDB 10.3:
| Handler_read_rnd           | 77    |
| Handler_read_rnd_next      | 42    |
| Handler_tmp_write          | 13    |
| Handler_update             | 13    |
0 голосов
/ 23 января 2019

Вы можете использовать CTE (Common Table Expression) в MariaDB 10.2+ для предварительного вычисления часто используемых выражений и присвоить им имена для последующего использования:

with
x as ( -- first we compute the CTE that we name "x"
  select
    *,
    coalesce(
      LAG(days_paid, 1) OVER (PARTITION BY claim_id ORDER BY month_id), 
      123456
    ) as prev_month -- this expression gets the name "prev_month"
  from my_table -- or a simple/complex join here
)
select -- now the main query
  prev_month
from x
... -- rest of your query here where "prev_month" is computed.

В основном запросе prev_month имеет задержкузначение или значение по умолчанию 123456, когда оно равно нулю.

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