我有一张名为TaxRates的表。我想创建一个名为EndDate
的计算列,类型为DATETIMEOFFSET NULL
。
EndDate应按时间顺序返回下一条记录的StartDate列的值。如果没有匹配则应返回null。
我对计算列没有太多经验。这就是我想要做的事情:
SELECT TOP 1 StartDate FROM TaxRates tr
WHERE tr.StartDate > StartDate
ORDER BY StartDate ASC
这会产生验证错误。
我应该在这做什么?
答案 0 :(得分:1)
尝试以下操作,看看它是否会产生您正在寻找的结果。
如果是这样,我们可以查看将其作为视图。
; WITH sorted_taxrates AS (
SELECT taxbandcode
, startdate
, Row_Number() OVER (PARTITION BY taxbandcode ORDER BY startdate ASC) As row_num
FROM taxrates
)
SELECT t1.taxbandcode
, t1.startdate
, t2.startdate As enddate
FROM sorted_taxrates As t1
LEFT
JOIN sorted_taxrates As t2
ON t1.taxbandcode = t2.taxbandcode
AND t2.row_num = t1.row_num + 1
答案 1 :(得分:-1)
这可以使用函数来完成,但正如所指出的,这会影响性能:
我的计算列定义:
dbo.fn_TaxRates_GetNextStartDate(StartDate)
我的功能:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_TaxRates_GetNextStartDate]
(
@StartDate DATETIMEOFFSET
)
RETURNS DATETIMEOFFSET
AS
BEGIN
RETURN (SELECT TOP 1 StartDate FROM dbo.TaxRates tr
WHERE tr.StartDate > @StartDate
ORDER BY StartDate ASC)
END