【问题标题】:MySQL Lead function not working. I have tried but its working as lag function. Kindly help meMySQL Lead 功能不起作用。我已经尝试过,但它的工作是滞后功能。请帮助我
【发布时间】:2018-11-22 10:22:22
【问题描述】:

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

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

【问题讨论】:

  • 在编号子查询中通过DESC 订购是否有效?
  • 不,它不工作。
  • @NarenP 在 MySQL 的最新版本中;需要首先在派生表中进行显式排序,然后在外部子查询中使用会话变量。否则不保证订单
  • @Madhur 我正在使用 MYSQL 5.6
  • @NarenP 请参阅:How to accept an answer for closure。你也因此获得积分。谢谢:)

标签: mysql database lead


【解决方案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

【讨论】:

    【解决方案2】:

    我会使用相关子查询并特别注意关系:

    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
    

    【讨论】:

    • 谢谢。但是,我得到了这个答案。输出:20090101 20120401 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001
    • 好像你有“关系”。您需要一个决胜局列,例如 ID/主键。你有吗?
    • 是 INSD_ID 列包含主键
    • @NarenP 查看修改后的答案。您可以使用它如果使用用户变量获得正确结果时遇到问题。
    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多