Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Taya_1993 Member Откуда: Сообщений: 12 |
Добрый день, подскажите что использовать для решения такой задачи: Предположим есть таблица ID ИМЯ ФАМИЛИЯ ДОЛЖНОСТЬ 1 Вася Игнатов начальник 1 Вася Игнатов уборщик 1 Вася Игнатов бухгалтер 5 Лена Карпова уборщик 8 Нина Сидорова бухгалтер 8 Нина Сидорова продавец Мне нужно для каждого одинакового ID пройтись по должностям, увидеть, что начальник это более высокая его должность и переприсвоить вместо уборщика - начальник и вместо бухгалтера - начальник. Т.е. Чтобы получилось так: ID ИМЯ ФАМИЛИЯ ДОЛЖНОСТЬ 1 Вася Игнатов начальник 1 Вася Игнатов начальник 1 Вася Игнатов начальник 5 Лена Карпова уборщик 8 Нина Сидорова бухгалтер 8 Нина Сидорова бухгалтер Для удобства сравнения, пожалуй могу вместо названия должности присвоить номер, например ID ИМЯ ФАМИЛИЯ ДОЛЖНОСТЬ 1 Вася Игнатов 9 1 Вася Игнатов 2 1 Вася Игнатов 5 5 Лена Карпова 2 8 Нина Сидорова 5 8 Нина Сидорова 4 И смотреть если 9>2, то присвоить 9. Но как проходить эти строки? Как вообще поступают, если нужно сравнить сроки? |
5 сен 17, 05:36 [20771407] Ответить | Цитировать Сообщить модератору |
Guf Member Откуда: Новосибирск Сообщений: 658 |
Taya_1993, Если
то WITH [cte] ([ID], [ИМЯ ФАМИЛИЯ], [ДОЛЖНОСТЬ]) AS ( SELECT TOP 1 WITH TIES [t].[ID] , [t].[ИМЯ ФАМИЛИЯ] , [t].[ДОЛЖНОСТЬ] FROM [Предположим есть таблица] [t] ORDER BY ROW_NUMBER() OVER(PARTITION BY [t].[ID], [t].[ИМЯ ФАМИЛИЯ] ORDER BY [t].[ДОЛЖНОСТЬ] DESC) ASC ) UPDATE [t] SET [ДОЛЖНОСТЬ] = [cte].[ДОЛЖНОСТЬ] FROM [Предположим есть таблица] [t] INNER JOIN [cte] ON [cte].[ID] = [t].[ID] AND [cte].[ИМЯ ФАМИЛИЯ] = [t].[ИМЯ ФАМИЛИЯ] ; |
||
5 сен 17, 06:33 [20771418] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
Guf, а чего не max() over(partition) ? тогда и джойн в апдейте не понадобится... |
5 сен 17, 07:09 [20771427] Ответить | Цитировать Сообщить модератору |
Guf Member Откуда: Новосибирск Сообщений: 658 |
Добрый Э - Эх, А я до сих пор в 2008 году живу, нам такого еще не завезли ![]() |
5 сен 17, 07:22 [20771434] Ответить | Цитировать Сообщить модератору |
Guf Member Откуда: Новосибирск Сообщений: 658 |
Вру! Завезли! Исправляюсь. WITH [cte] [ДОЛЖНОСТЬ СТАРАЯ], [ДОЛЖНОСТЬ НОВАЯ]) AS ( SELECT TOP 1 WITH TIES , [t].[ДОЛЖНОСТЬ] , MAX() OVER (PARTITION BY [t].[ДОЛЖНОСТЬ]) FROM [Предположим есть таблица] [t] ) UPDATE [cte] SET [ДОЛЖНОСТЬ СТАРАЯ] = [ДОЛЖНОСТЬ НОВАЯ] ; |
||
5 сен 17, 07:34 [20771442] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
Guf, top 1 with ties, наверное, лишний? ;) |
5 сен 17, 07:55 [20771450] Ответить | Цитировать Сообщить модератору |
Guf Member Откуда: Новосибирск Сообщений: 658 |
Добрый Э - Эх, Я как iap 20770168 ![]() WITH [cte] [ДОЛЖНОСТЬ СТАРАЯ], [ДОЛЖНОСТЬ НОВАЯ]) AS ( SELECT [t].[ДОЛЖНОСТЬ] , MAX() OVER (PARTITION BY [t].[ДОЛЖНОСТЬ]) FROM [Предположим есть таблица] [t] ) UPDATE [cte] SET [ДОЛЖНОСТЬ СТАРАЯ] = [ДОЛЖНОСТЬ НОВАЯ] ; |
5 сен 17, 08:12 [20771460] Ответить | Цитировать Сообщить модератору |
Гость проходящий мимо
Guest |
Taya_1993, WITH TB AS ( SELECT 1 ID, 'Вася Игнатов' FIO, 9 PROF UNION ALL SELECT 1 ID, 'Вася Игнатов' FIO, 2 PROF UNION ALL SELECT 1 ID, 'Вася Игнатов' FIO, 5 PROF UNION ALL SELECT 5 ID, 'Лена Карпова' FIO, 2 PROF UNION ALL SELECT 8 ID, 'Нина Сидорова' FIO, 5 PROF UNION ALL SELECT 8 ID, 'Нина Сидорова' FIO, 4 PROF ) SELECT *, PROF_PRIOR= MAX(PROF) OVER (PARTITION BY (ID)) FROM TB |
5 сен 17, 11:38 [20772082] Ответить | Цитировать Сообщить модератору |
Taya_1993 Member Откуда: Сообщений: 12 |
Спасибо всем, очень помогли :) |
7 сен 17, 23:29 [20780182] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |