繁体   English   中英

如何将列添加到现有表并计算值

[英]How to add column to an existing table and calculate the value

表信息:

在此处输入图像描述

我想添加新列并使用以下代码计算 alarmTime 列的不同:

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

如何在表格中添加计算? 因为总是有这样的错误:

窗口函数只能出现在 SELECT 或 ORDER BY 子句中。

您正在使用显示计算值的生成虚拟列的语法( ADD columnname AS expression )。

但是,这仅适用于在同一行中找到的值。 您不能拥有查看其他行的生成列。

如果您现在考虑创建一个普通列并用计算值填充它,这是您不应该做的事情。 不要冗余地存储值。 您始终可以在即席查询中获得差异。 如果您改为冗余存储它,则必须在每次插入、更新和删除时都考虑到这一点。 如果在某个时候您发现差异与时间值不匹配的行,那么哪一列包含正确的值,哪一列包含不正确的值? 闹钟时间还是差异? 你将无法分辨。

您可以做的是为方便起见创建一个视图:

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

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

但请记住,您的视图可能会在您每次访问它时读取整个表并对其进行排序。 如果您只查询某个时间范围,那么计算查询中的差异会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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