MySQL Lead函数不工作。我已经试过了,但它是作为滞后函数工作的。请帮帮我

MySQL Lead函数不工作。我已经试过了,但它是作为滞后函数工作的。请帮帮我,mysql,database,lead,Mysql,Database,Lead,从昨天开始,我尝试在select查询中实现lead函数功能,但它对我不起作用 SELECT inbp_ingangsdatum, previous FROM (SELECT ibp.inbp_ingangsdatum, @prev previous, @prev := inbp_ingangsdatum AS prev FROM base ibp,

从昨天开始,我尝试在select查询中实现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;
电流输出

预期产量


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

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

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

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
LEAD函数获取下一行的值。我不知道你为什么叫它prev。为了清楚起见,我使用了别名next

在使用用户定义的变量时,我们可以在SELECT子句中访问前一行的值,但获取下一行的值很棘手。我们必须按照inbp_ingangsdatum的降序顺序明确订购,降序顺序与我们的最终排序要求相反

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

最后,我们将在最外层查询中对结果集进行重新排序

模式MySQL v5.6

问题1

结果:

LEAD函数获取下一行的值。我不知道你为什么叫它prev。为了清楚起见,我使用了别名next

在使用用户定义的变量时,我们可以在SELECT子句中访问前一行的值,但获取下一行的值很棘手。我们必须按照inbp_ingangsdatum的降序顺序明确订购,降序顺序与我们的最终排序要求相反

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

最后,我们将在最外层查询中对结果集进行重新排序

模式MySQL v5.6

问题1

结果:


如果您在编号子查询中按DESC排序,它是否有效?否,它不起作用。@NarenP在MySQL的最新版本中;首先需要在派生表中进行显式排序,然后在外部子查询中使用会话变量。否则,订单将不可用guaranteed@Madhur我正在使用MYSQL 5。6@NarenP请参阅:。你也会因此得到分数。谢谢:如果您在编号子查询中按DESC排序,它可以工作吗?不,它不工作。@NarenP在MySQL的最新版本中;首先需要在派生表中进行显式排序,然后在外部子查询中使用会话变量。否则,订单将不可用guaranteed@Madhur我正在使用MYSQL 5。6@NarenP请参阅:。你也会因此得到分数。谢谢。但是,我得到了这个答案。输出:20090101 20120401 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001似乎你有领带。您需要一个断开连接的列,例如ID/主键。你们有吗?是的,检查柱包含初级key@NarenP见修改后的答案。如果在获取用户变量的正确结果时遇到问题,可以使用它。谢谢。但是,我得到了这个答案。输出:20090101 20120401 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001 20120401 20121001似乎你有领带。您需要一个断开连接的列,例如ID/主键。你们有吗?是的,检查柱包含初级key@NarenP见修改后的答案。如果在使用用户变量获得正确结果时遇到问题,可以使用它。
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
Create table base (inbp_ingangsdatum int);

insert into base
values 
(20090101),
(20120401),
(20120402),
(20120403),
(20120404),
(20120405);
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 |          |