0

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

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

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

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

这会产生验证错误。

我应该在这里做什么?

4

2 回答 2

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
于 2013-11-14T15:19:37.260 回答
-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
于 2013-11-14T12:50:07.833 回答