使用循环引用创建计算列

时间:2013-11-13 14:41:19

标签: sql sql-server sql-server-2008 tsql calculated-columns

我有一张名为TaxRates的表。我想创建一个名为EndDate的计算列,类型为DATETIMEOFFSET NULL

EndDate应按时间顺序返回下一条记录的StartDate列的值。如果没有匹配则应返回null。

我对计算列没有太多经验。这就是我想要做的事情:

SELECT TOP 1 StartDate FROM TaxRates tr
WHERE tr.StartDate > StartDate
ORDER BY StartDate ASC

这会产生验证错误。

我应该在这做什么?

2 个答案:

答案 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