简体   繁体   中英

How to add column to an existing table and calculate the value

Table info:

在此处输入图像描述

I want to add new column and calculated the different of the alarmTime column with this code:

ALTER TABLE [DIALinkDataCenter].[dbo].[DIAL_deviceHistoryAlarm] 
    ADD dif AS (DATEDIFF(HOUR, LAG((alarmTime)) OVER (ORDER BY (alarmTime)), (alarmTime)));

How to add the calculation on the table? Because always there's error like this:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

You are using the syntax for a generated virtual column that shows a calculated value ( ADD columnname AS expression ).

This, however, only works on values found in the same row. You cannot have a generated column that looks at other rows.

If you consider now to create a normal column and fill it with calculated values, this is something you shouldn't do. Don't store values redundantly. You can always get the difference in an ad-hoc query. If you store this redundantly instead, you will have to consider this in every insert, update, and delete. And if at some time you find rows where the difference doesn't match the time values, which column holds the correct value then and which the incorrect one? alarmtime or dif? You won't be able to tell.

What you can do instead is create a view for convenience:

create view v_dial_devicehistoryalarm as
select 
  dha.*,
  datediff(hour, lag(alarmtime) over (order by alarmtime), alarmtime) as dif
from dial_devicehistoryalarm dha;

Demo: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b7f9b5eef33e72955c7f135952ef55b5

Remember though, that your view will probably read and sort the whole table everytime you access it. If you query only a certain time range, it will be faster hence to calculate the differences in your query instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM