从昨天开始,我正在尝试在选择查询中实现导入功能,但对我不起作用。
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
答案 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 | |