Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Как добавить столбец, где будет ID следующего заказа?

Должно быть вот так, первые две колонки из старой таблицы, а создать нужно третий столбец.

К сообщению приложен файл. Размер - 40Kb


Сообщение было отредактировано: 2 фев 20, 18:41
2 фев 20, 18:35    [22071191]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
LEAD(OrderId) OVER (PARTITION BY CustomerId ORDER BY OrderId)
2 фев 20, 19:41    [22071223]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina,
большое спасибо!!!
2 фев 20, 20:27    [22071235]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina,
большое спасибо!!!
2 фев 20, 20:31    [22071236]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina, если не сложно, посмотрите, правильно ли я понимаю:
PARTITION BY указывает по какой колонке разделяем на группы, т.е. ищем в рамках одного Customer.
ORDER BY указывает на порядок, в котором будут обрабатываться OrderID. Так как здесь в порядке возрастания, то первое же значение, которое будет больше текущего будет записано? Или будет записан самый большой OrderID по клиенту?
2 фев 20, 21:07    [22071253]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Luna17
Так как здесь в порядке возрастания, то первое же значение, которое будет больше текущего будет записано? Или будет записан самый большой OrderID по клиенту?
Ни то, ни другое.

Partition определяет группу, к которой относится ТЕКУЩАЯ запись.
Order by определяет, как следует отсортировать записи (всей!) группы, к которой относится ТЕКУЩАЯ запись.
LEAD() возвращает значение, взятое из следующей записи для ТЕКУЩЕЙ записи (из её группы, в указанной сортировке).

Это выполняется для каждой записи выходного набора.

Сообщение было отредактировано: 2 фев 20, 21:17
2 фев 20, 21:17    [22071258]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina, меня смущает LEAD, ведь мне нужен следующий ID, а не максимальный в группе. Может можно взять LAG, и тогда ORDER BY OrderID DESC?
2 фев 20, 21:18    [22071259]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Luna17
меня смущает LEAD, ведь мне нужен следующий ID, а не максимальный в группе.
Для получения максимального в группе использовался бы MAX(OrderId) OVER (PARTITION BY CustomerId ORDER BY OrderId).
Luna17
Может можно взять LAG, и тогда ORDER BY OrderID DESC?

Да, LEAD(OrderId) OVER (PARTITION BY CustomerId ORDER BY OrderId) по результату эквивалентен LAG(OrderId) OVER (PARTITION BY CustomerId ORDER BY OrderId DESC). Но последний - это почти наверняка плюс ещё одна сортировка.
2 фев 20, 21:21    [22071261]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina, ага вроде понятно, большое спасибо! А если в ID были бы буквы, ну в общем по ID нельзя сортировать. А у меня в старой таблице есть еще даты заказов, можно ли отсортировать по ним, но даты не выводить? вот так

select CustomerID,OrderID ,lead(OrderID) over (partition by CustomerID order by OrderDate)
from orders

Сообщение было отредактировано: 2 фев 20, 21:23
2 фев 20, 21:23    [22071262]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Luna17
А если в ID были бы буквы, ну в общем по ID нельзя сортировать.
Цифры, буквы, смайлы... да хоть цирк с конями, какая разница? Должно быть поле (или комбинация полей), при сортировке по которому каждая запись - уникальна.
2 фев 20, 21:30    [22071267]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina,
изините за тупёж, пожалуйста, но не дошло
Если OrderID не будет уникальным по дате сортировать нельзя?
2 фев 20, 21:42    [22071275]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19999
Luna17
Если OrderID не будет уникальным по дате сортировать нельзя?
Можно. Только результат будет недетерминированным - а нафига он такой кому нужен?
Вот, скажем, пример - простое добавление индекса изменяет результат. Это и есть следствие неуникальности использованного выражения сортировки.

А если там же сделать ORDER BY orderID, amount (бред, конечно, но на ПОКАЗАННЫХ данных это будет уникальная сортировка) - создание индекса не изменит результат.

Сообщение было отредактировано: 2 фев 20, 21:55
2 фев 20, 21:53    [22071284]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи новичку  [new]
Luna17
Member

Откуда:
Сообщений: 10
Akina, большое-большое спасибо! Теперь ясно и есть где тренироваться
2 фев 20, 22:14    [22071294]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить