Невозможно обновить представление / функцию 'cte', поскольку она содержит агрегаты при расчете времени за 24 часа - PullRequest
0 голосов
/ 30 января 2019

У меня есть дата alarms со столбцами, два из которых: tmStartTime и tmEndtime.Я хочу рассчитать общее активное время tmTotals в часах, это может быть более 24 часов.Так, например, 24:00:04

моя таблица данных Alarms (здесь я использовал тип данных TIME, который работал нормально для времен менее 24 часов):

tmStarttime               tmEndTime                 tmTotals
--------------------------------------------------------------
2018-12-03 00:00:19.257   2018-12-04 00:00:23.288   00:00:04  (is actually 24:00:04)
2018-12-03 23:59:16.817   2018-12-04 00:01:42.942   00:02:26
2018-12-03 23:59:45.005   2018-12-04 00:07:03.650   00:07:18
2018-12-03 23:11:57.645   2018-12-04 00:07:16.785   00:55:19
2018-12-04 00:03:52.086   2018-12-04 00:07:37.991   00:03:45
2018-12-04 00:07:16.787   2018-12-04 00:08:14.302   00:00:57
2018-12-04 00:08:30.430   2018-12-04 00:08:34.480   00:00:04

со временем более 24часы, которые я нашел, я должен сделать:

UPDATE Messages_History
SET tmTotals
= right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 3600 )),2) + ':'
+ right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 60 ) % 60 ),2) + ':'
+ right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) %60 )),2)

Здесь я получил ошибку:

An aggregate may not appear in the set list of an UPDATE statement.

Затем я нашел, что должен сделать:

    WITH cte

    AS (SELECT new_tmTotals 
    = right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 3600 )),2) + ':'
    + right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 60 ) % 60 ),2) + ':'
    + right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) %60 )),2), tmTotals
    FROM Messages_History
    GROUP BY tmTotals)

    UPDATE cte
    SET tmTotals = new_tmTotals

При выполненииХранимая процедура Я получил сообщение об ошибке:

Cannot update the view or function 'cte' because it contains aggregates, or a DISTINCT or GROUP BY clause, or PIVOT or UNPIVOT operator.

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

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Добавьте Primary или Unique ключ к таблице, чтобы решить эту проблему.А потом используйте ниже одного ...

WITH cte

AS (SELECT UniqueID 'Uniq_ID',new_tmTotals = right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 3600 )),2) + ':'
+ right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 60 ) % 60 ),2) + ':'
+ right ('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) %60 )),2), tmTotals
FROM Messages_History
GROUP BY tmTotals)

UPDATE cte
SET tmTotals = new_tmTotals
WHERE UniqueID = Uniq_ID
0 голосов
/ 30 января 2019

В качестве альтернативы вы можете попробовать обновить с помощью объединения:

UPDATE mh1
SET tmTotals = mh2.new_tmTotals
FROM Messages_History mh1
INNER JOIN
(
    SELECT
        tmTotals,
           RIGHT('0' + convert(varchar(9),
           (sum(datediff(second,tmStartTime,tmEndTime)) / 3600 )),2) + ':' +
           RIGHT('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) / 60 ) % 60 ),2) + ':' +
           RIGHT('0' + convert(varchar(9),(sum(datediff(second,tmStartTime,tmEndTime)) %60 )),2) AS new_tmTotals
    FROM Messages_History
    GROUP BY tmTotals
) mh2
    ON mh1.tmTotals = mh2.tmTotals;

Основная проблема с ошибкой заключается в том, что вы пытаетесь обновить производную (агрегированную) таблицу, а SQL Server отказываетсярешить, как должна обновляться исходная базовая таблица.

...