MariaDB中LAG函数的默认值

时间:2019-01-22 21:06:43

标签: mariadb

我正在尝试建立一个视图,该视图允许我跟踪两个连续month_ids的支付值之间的差异。但是,当缺少一个数字时,那是因为它是第一个条目,因此支付的金额为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 :(得分:1)

您可以在MariaDB 10.2+中使用CTE(公用表表达式)来预先计算常用的表达式并将其命名以供以后使用:

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

答案 1 :(得分:1)

为什么使用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    |