#sql #postgresql #sql-update #window-functions
#sql #postgresql #sql-обновление #окно-функции
Вопрос:
У меня есть таблица, в которую я добавляю столбец позиции. Мне нужно будет добавить нумерованную позицию ко всем строкам, уже находящимся в таблице. Нумерация зависит от 4 столбцов, которые будут соответствовать друг другу между строками. Например
id| name| fax | cart| area |
1| jim | 1 | 4 | 1 |
2| jim | 1 | 4 | 1 |
3| jim | 2 | 4 | 1 |
4| jim | 2 | 4 | 1 |
5| bob | 1 | 4 | 1 |
6| bob | 1 | 4 | 1 |
7| bob | 2 | 5 | 1 |
8| bob | 2 | 5 | 2 |
9| bob | 2 | 5 | 2 |
10| bob | 2 | 5 | 2 |
would result with
id| name| fax | cart| area | position
1| jim | 1 | 4 | 1 | 1
2| jim | 1 | 4 | 1 | 2
3| jim | 2 | 4 | 1 | 1
4| jim | 2 | 4 | 1 | 2
5| bob | 1 | 4 | 1 | 1
6| bob | 1 | 4 | 1 | 2
7| bob | 2 | 5 | 1 | 1
8| bob | 2 | 5 | 2 | 1
9| bob | 2 | 5 | 2 | 2
10| bob | 2 | 5 | 2 | 3
Мне нужен SQL-запрос, который будет выполнять итерацию по таблице и добавлять позицию.
Комментарии:
1. Пожалуйста, укажите в своем вопросе базу данных, которую вы используете: mysql, postgresql, oracle …?
Ответ №1:
Использовать row_number()
:
select
t.*,
row_number() over(partition by name, fax, cart, area order by id) position
from mytable t
Если вам нужен update
запрос:
update mytable as t
set position = rn
from (
select id, row_number() over(partition by name, fax, cart, area order by id) rn
from mytable
) x
where x.id = t.id
Комментарии:
1. Потрясающе. Как бы я вставил результат в столбец позиции. Кажется, это просто отображает его как результат.
2. @Los: добро пожаловать. Обновление таблицы не кажется хорошей идеей. Что делать, если строка с позицией
1
затем удаляется или обновляется? Вам нужно оглянуться на другие строки и обновить их положение. Вместо этого вы можете получать информацию в любое время, когда вам нужно, в своих запросах, используя вышеупомянутое решение (или вы можете создать представление, которое включает ее, если вы собираетесь использовать ее часто).3. Спасибо за вашу помощь. Это упорядоченный список, который пользователь может изменить порядок, и поэтому его необходимо сохранить. Вот почему мне нужно вставить позицию