#mysql #sql
Вопрос:
У меня есть таблица со следующими данными :
ордерид | item_amount | total_bill_amount |
---|---|---|
123 | 2 | 8 |
123 | 6 | 8 |
455 | 4 | 11 |
455 | 6 | 11 |
455 | 1 | 11 |
Я хочу заменить повторяющееся значение на total_bill_amount
значение null, чтобы первая запись всегда содержала значение, а все, что будет после, — значение null. Пример того, как я хочу видеть данные :
ордерид | item_amount | total_bill_amount |
---|---|---|
123 | 2 | 8 |
123 | 6 | нулевой |
455 | 4 | 11 |
455 | 6 | нулевой |
455 | 1 | нулевой |
Обратите внимание, что моя версия MySQL 5.7, поэтому я не могу использовать какие-либо оконные функции в MySQL 8.
Комментарии:
1. Таблица представляет собой набор неупорядоченных строк, в ваших данных нет «первой» записи; Идентификатор заказа 455 вы хотите сохранить номер элемента 4, но не 6 или 1 — вам нужен какой-то способ упорядочения данных в соответствии с вашими критериями.
2. на самом деле заказ будет соответствовать идентификатору заказа, первая строка для идентификатора заказа должна показывать общую сумму счета, а остальные строки для идентификатора заказа должны быть пустыми
3. вы не поняли. Идентификатор заказа не уникален, в каждой группе нет порядка.
Ответ №1:
Вы можете использовать row_number()
с подзапросом:
with to_r(rnum, id, a, t) as ( select row_number() over (order by o.orderid), o.* from orders o ) select r.id, r.a, case when (select sum(r1.t = r.t and r1.id = r.id and r.rnum gt;= r1.rnum) from to_r r1) gt; 1 then null else r.t end from to_r r