SQL 中的当前列

IsCurrent Column In SQL

我有一个与此类似的架构:

ID     UserID      DateApplied     IsCurrent
1      1           2016-07-01      0
2      2           2016-07-05      0
3      1           2016-07-04      0
4      1           2016-07-10      1
5      2           2016-07-07      1

有没有办法使 IsCurrent 列成为计算列,该列适用于每个用户的最大日期。

即:每次添加新记录时更新table,最新的记录将具有当前(最近的)DateTime,这应该使IsCurrent 列为真。

我相信我现在可以通过使用一个函数来让它工作。计算列规范似乎只能引用该特定行的列,但您可以使用这些参数调用方法。

所以,我所做的就是定义函数。对于这种情况,它将是这样的:

CREATE FUNCTION IsCurrent (@UserID  int, @DateApplied int) 
    RETURNS BIT AS 
    BEGIN   

        DECLARE @MaxDate DATETIME;  
        DECLARE @IsCurrent bit;     

        SET @MaxDate = (SELECT MAX(DateApplied)
                        FROM MyTable 
                        WHERE MyTable.UserID = @UserID)         

        IF (@MaxDate = @DateApplied)        
            SET @IsCurrent = 1;     
        ELSE
            SET @IsCurrent = 0;

        RETURN @IsCurrent; 
    END 
GO

那么您的计算列规范将是:

dbo.IsCurrent(UserID, DateApplied)

注意这可能 impact performance if you have a lot of inserts.

您可以使用 View 并使用 ROW_NUMBER() OVER PARTITION BY

SELECT
   Id,
   UserID,
   DateApplied,
   CASE WHEN x.RowNum = 1 THEN 1 ELSE 0 END IsCurrent
FROM 
(
   SELECT
      RowNum = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY DateApplied DESC),
      Id,
      UserID,
      DateApplied
   FROM YourTable
) x