MySQL Lead函数无法正常工作。我试过了,但它作为滞后功能。请帮助我

时间:2018-11-22 10:22:23

标签: mysql database lead

从昨天开始,我正在尝试在选择查询中实现导入功能,但对我不起作用。

SELECT inbp_ingangsdatum,
       previous
FROM   (SELECT ibp.inbp_ingangsdatum,
               @prev                      previous,
               @prev := inbp_ingangsdatum AS prev
        FROM   base ibp,
               (SELECT @prev := '') r
        ORDER  BY inbp_ingangsdatum) AS t1;

当前输出

val         previous
20090101    
20120401    20090101
20120402    20120401
20120403    20120402
20120404    20120403

预期产量

val         previous

20090101    20120401
20120401    20120402
20120402    20120403
20120403    20120404
20120404    20120405

2 个答案:

答案 0 :(得分:1)

我将使用相关的子查询并特别注意联系:

SELECT INSD_ID, inbp_ingangsdatum, (
    SELECT inbp_ingangsdatum
    FROM base AS x
    WHERE (inbp_ingangsdatum = base.inbp_ingangsdatum AND INSD_ID > base.INSD_ID)
    OR    (inbp_ingangsdatum > base.inbp_ingangsdatum)
    ORDER BY inbp_ingangsdatum
    LIMIT 1
) AS next_date
FROM base
ORDER BY inbp_ingangsdatum, INSD_ID

答案 1 :(得分:1)

LEAD()函数获取“下一行”值。我不知道您为什么称其为prev。为了清楚起见,我改用别名next

使用用户定义的变量时,我们可以在SELECT子句中访问上一行的值,但是要获取下一行(即将到来的)的值很棘手。我们将必须按照inbp_ingangsdatum的降序显式排序(与最终的排序要求相反)。

现在,我们将使用此结果集获取“下一个”行。由于顺序相反,上一个值基本上是下一个值。

我们最终将在最外面的查询中对结果集重新排序。


模式(MySQL v5.6)

Create table base (inbp_ingangsdatum int);

insert into base
values 
(20090101),
(20120401),
(20120402),
(20120403),
(20120404),
(20120405);

查询#1

SELECT 
  dt2.val, dt2.next
FROM 
(
  SELECT
    @nxt AS next, 
    @nxt := dt.inbp_ingangsdatum AS val 
  FROM 
  (
    SELECT
      ibp.inbp_ingangsdatum
    FROM base AS ibp
    ORDER BY ibp.inbp_ingangsdatum DESC 
  ) AS dt 
  CROSS JOIN (SELECT @nxt := '') AS user_init_vars
) AS dt2 
ORDER BY dt2.val;

结果:

| val      | next     |
| -------- | -------- |
| 20090101 | 20120401 |
| 20120401 | 20120402 |
| 20120402 | 20120403 |
| 20120403 | 20120404 |
| 20120404 | 20120405 |
| 20120405 |          |

View on DB Fiddle