Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Taya_1993,
Если
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]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Добрый Э - Эх
Guest
Guf,

а чего не max() over(partition) ?
тогда и джойн в апдейте не понадобится...
5 сен 17, 07:09    [20771427]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Добрый Э - Эх,

А я до сих пор в 2008 году живу, нам такого еще не завезли
5 сен 17, 07:22    [20771434]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Guf
Добрый Э - Эх,

А я до сих пор в 2008 году живу, нам такого еще не завезли

Вру! Завезли! Исправляюсь.
WITH [cte] [ДОЛЖНОСТЬ СТАРАЯ], [ДОЛЖНОСТЬ НОВАЯ])
AS (
    SELECT TOP 1 WITH TIES
          , [t].[ДОЛЖНОСТЬ]
          , MAX() OVER (PARTITION BY [t].[ДОЛЖНОСТЬ])
        FROM [Предположим есть таблица] [t]
   )
UPDATE [cte]
    SET [ДОЛЖНОСТЬ СТАРАЯ] = [ДОЛЖНОСТЬ НОВАЯ]
;
5 сен 17, 07:34    [20771442]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Добрый Э - Эх
Guest
Guf,

top 1 with ties, наверное, лишний? ;)
5 сен 17, 07:55    [20771450]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Добрый Э - Эх,
Я как iap 20770168
WITH [cte] [ДОЛЖНОСТЬ СТАРАЯ], [ДОЛЖНОСТЬ НОВАЯ])
AS (
    SELECT  [t].[ДОЛЖНОСТЬ]
          , MAX() OVER (PARTITION BY [t].[ДОЛЖНОСТЬ])
        FROM [Предположим есть таблица] [t]
   )
UPDATE [cte]
    SET [ДОЛЖНОСТЬ СТАРАЯ] = [ДОЛЖНОСТЬ НОВАЯ]
;
5 сен 17, 08:12    [20771460]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Гость проходящий мимо
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]     Ответить | Цитировать Сообщить модератору
 Re: Пройтись по строкам таблицы и сравнить значения из одного столбца.  [new]
Taya_1993
Member

Откуда:
Сообщений: 12
Спасибо всем, очень помогли :)
7 сен 17, 23:29    [20780182]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить