Как обновить строку в SQL Server со средним значением предыдущих строк - PullRequest
0 голосов
/ 30 апреля 2019

Я работаю в базе данных, которая постоянно заполняется данными, поступающими с какого-либо оборудования. К сожалению, за последние месяцы некоторые данные оказались неверными, заполнив базу мусором. Чтобы это исправить, мне нужно обновить неправильные строки простым средним значением трех последних данных, сохраненных перед каждой ошибочной строкой.

Есть ли прямой код для этого? Я вручную вычислял и обновлял каждую строку в последние часы, и это не очень продуктивно. Я знаю, что могу использовать UPDATE с SELECT, чтобы изменить данные строки с данными из другой таблицы, но как мне «выбрать последние три данных со столбцом id = equip_id, sum, делить на три и обновить, где я хочу»? Я думал примерно так:

UPDATE problem_table 
SET Col1 = problem_table_id.Col1, 
    Col2 = problem_table_id.Col2 
FROM (
    SELECT EQUIP_ID, Col1, Col2 
    FROM problem_table) problem_table_id
WHERE 
    EQUIP_ID = the_id_i_want and
    DATA_ID < curr_buggy_row

Но это (или что-то в этом роде) не будет иметь среднее значение последних X-данных, но, в лучшем случае, последних данных перед строкой с ошибками.

1 Ответ

2 голосов
/ 30 апреля 2019

Вот вариант.CTE работают так же, как обновляемые представления, которые напрямую влияют на базовые таблицы.

WITH CTE AS(
SELECT *,
    AVG( Col1) OVER( ORDER BY SomeDate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS AVGCol1,
    AVG( Col2) OVER( ORDER BY SomeDate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS AVGCol2
FROM problem_table
WHERE 
    EQUIP_ID = @the_id_i_want and
    DATA_ID <= @curr_buggy_row
)
UPDATE CTE 
SET Col1 = AVGCol1,
    Col2 = AVGCol2
WHERE 
    DATA_ID = curr_buggy_row;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...