SQL Server - 基于24小时(第二天)的MyCTE查询

时间:2015-06-26 12:52:31

标签: sql sql-server sql-server-2012

我有这段代码:

;WITH MyCTE AS
(
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY CardUser ORDER BY CardTableID) AS NewVariation
    FROM   CardChecker
)
UPDATE MyCTE 
SET    Status = NewVariation

当前更新了状态列,但是我想要发生的是24小时内的状态,第二天的状态再次从1开始,并根据上面指定的 CardUser 再次计算:

当前数据以及会发生什么:

2   aaa 1   2015-06-25 08:00:00.000 123 1   NULL
3   ccc 1   2015-06-25 00:00:00.000 124 1   NULL
4   aaa 1   2015-06-25 17:30:00.000 125 2   NULL
5   aaa 1   2015-06-26 17:30:00.000 125 *3* NULL

我想要发生的事情:

2   aaa 1   2015-06-25 08:00:00.000 123 1   NULL
3   ccc 1   2015-06-25 00:00:00.000 124 1   NULL
4   aaa 1   2015-06-25 17:30:00.000 125 2   NULL
5   aaa 1   2015-06-26 17:30:00.000 125 *1* NULL

我不太确定如何将其添加到上述查询中,以便有人能指出我正确的方向吗?

主要问题是EventTime字段包含日期和时间,因此将其添加为PARTITION意味着状态将始终为1,基于字段的时间参数

感谢您的帮助

当前的CardTable结构:

CREATE TABLE CardTable (CardTableID INT IDENTITY (1,1) NOT NULL,
CardUser VARCHAR(50),
CardNumber VARCHAR(50),
EventTime DATETIME,
Status INT)

1 个答案:

答案 0 :(得分:1)

您可以CONVERT()将EventTime设为DATE类型,然后PARTITION

;WITH MyCTE AS
(
    SELECT Status,
           ROW_NUMBER() OVER(PARTITION BY CardUser, CONVERT(DATE, EventTime) 
                             ORDER BY CardTableID) AS NewVariation
    FROM   CardChecker
)
UPDATE MyCTE 
SET    Status = NewVariation

您的查询基本上每次都不必要地更新整个表。如果EventTime是系统的当前日期时间,则标记已标记已更新状态将改善性能。

;WITH MyCTE AS
(
    SELECT Status,
           ROW_NUMBER() OVER(PARTITION BY CardUser, CONVERT(DATE, EventTime) 
                             ORDER BY CardTableID) AS NewVariation
    FROM   CardChecker
    WHERE  Status IS NULL OR
           CONVERT(DATE, EventTime) = CONVERT(DATE, GETDATE())
)
UPDATE MyCTE 
SET    Status = NewVariation