Функция MySQL Lead не работает.Я пытался, но он работает как функция задержки.Пожалуйста, помогите мне - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь реализовать функциональность ведущей функции в запросе выбора со вчерашнего дня, но она не работает для меня.

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 голосов
/ 22 ноября 2018

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 |          |

Просмотр на БД Fiddle

0 голосов
/ 22 ноября 2018

Я бы использовал коррелированный подзапрос и уделил бы дополнительное внимание связям:

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
...