Member 12770648 Ответов: 2

Как последовательно обновлять записи в группах по 5 человек


Привет,

Поле даты в таблице должно быть обновлено в группах по пятеркам после того как первая группа будет обновлена
дата будет увеличена на 1, и следующие 5 записей будут обновлены, пока не появятся все записи в таблице
будет истощен.


Как это сделать в :: MS SQL SERVER с помощью запроса

дату начала 14/01/2018'


IDNO ИМЯ DATE_CHG
--------------------------
001 Эми 14/01/2018
002 TET 14/01/2018
003 ял 14/01/2018
004 ПЭТ 14/01/2018
005 Джон 14/01/2018

0011 PAM 15/01/2018
0022 сет 15/01/2018
0033 Йельского 15/01/2018
0044 Энди 15/01/2018
0055 Джон 15/01/2018


Спасибо

Что я уже пробовал:

Это продолжающееся развитие рассматриваемое в более ранних кодах

David_Wimbley

Почему вам нужно обновлять только в группах по 5 человек? Мне кажется, что SQL будет оптимизировать запрос соответствующим образом, и вы также можете посмотреть на индексы в ваших таблицах, чтобы узнать, нужно ли вам добавлять/удалять индексы.

Второй вопрос заключается в том, как вы определяете, какие 5 обновляются в группе? Вы просто пытаетесь обновить все записи с именем "YAL"? Или вы просто хотите обновить его 5 за раз независимо от критериев...то есть 5 за раз с тем, как они выходят из таблицы. Это означает, что вы можете обновлять идентификаторы 11, 3, 2, 1, 55.

На мой взгляд, вам нужно либо прояснить, что вы делаете, либо переосмыслить то, чего вы хотите достичь.

2 Ответов

Рейтинг:
0

OriginalGriff

Это будет сложно, так как вы не можете напрямую использовать GROUP BY в инструкции UPDATE (UPDATE не допускает агрегатных функций.
Но... вы можете использовать соединение с выбором...Но даже в этом случае это будет сложно, потому что вам нужно выбрать, чтобы вернуть значения идентификатора строки вместе с номером, который вы можете использовать в функции ADDDAYS для генерации кода даты.
Последний бит относительно прост: ROW_NUMBER (Transact-SQL) | Microsoft Docs[^] даст вам это, если вы используете модуль 5 с ним.
Но это будет сложно разработать, и сложно поддерживать и модифицировать.

Я бы хотел сказать, что это должно быть сделано в презентационном программном обеспечении, а не в SQL чисто так, чтобы его было легче читать!


Рейтинг:
0

Richard Deeming

Что-то вроде этого должно сработать:

DECLARE @StartDate date = '20180114';

WITH cte As
(
    SELECT
        IDNO,
        (ROW_NUMBER() OVER (ORDER BY IDNO) - 1) / 5 As DaysToAdd
    FROM
        YourTable
)
UPDATE
    T
SET
    DATE_CHG = DateAdd(day, G.DaysToAdd, @StartDate)
FROM
    YourTable As T
    INNER JOIN cte As G
    ON G.IDNO = T.IDNO
;