SQL Server:每隔5个月更新一次记录

时间:2019-08-27 11:17:20

标签: sql-server

我要更新15条记录,因为前5条记录的日期应为2019年6月,下5条记录应为2019年7月,最后5条记录应为2019年8月(基于员工ID),任何人都可以告诉我如何编写此类型的查询在SQL Server Management Studio V 17.7中,我尝试使用以下查询,但无法对接下来的5行进行操作。

就像下面的查询

Update TOP(5) emp.employee(nolock) set statusDate=GETDATE()-31 where EMPLOYEEID='XCXXXXXX';

2 个答案:

答案 0 :(得分:0)

要仅更新表的特定数量的行,您将需要包含FROM子句并加入子查询以限制行数。我建议使用OFFSET AND FETCH而不是top,这样您就可以跳过X行数

您还将希望使用DATEADD函数,而不是直接从DateTime函数GETDATE()中减去一个数字。我不确定,但我认为您的查询将减去毫秒。如果您打算回去一个月,我建议您减去一个月而不是31天。另外,也可以更容易地指定一个确切的日期,例如“ 2019-06-01”

例如:

TableA -TableAID INT PK -员工编号INT FK -statusDate DATETIME

UPDATE TableA
SET statusDate = '2019-06-01'
FROM TableA
INNER JOIN
(
SELECT TableAID
FROM TableA
WHERE EmployeeID = ''
ORDER BY TableAID
OFFSET 0 ROWS
FETCH NEXT 5 ROWS ONLY
) T1 ON TableA.TableAID = T1.TableAID

现在,您的原始查询似乎正在更新表employee而不是purchases表。您将要用要更新的表替换我的TableA,并用它的PK字段替换TableAID。

答案 1 :(得分:0)

您可以使用ROW_NUMBER来获得员工的排名,然后只需更新前15行即可。

;WITH EmployeeRowsWithRowNumbers AS
(
    SELECT
        T.*,
        RowNumberByEmployee = ROW_NUMBER() OVER (
            PARTITION BY 
                T.EmployeeID -- Generate a ranking by each different EmployeeID
            ORDER BY 
                (SELECT NULL)) -- ... in no particular order (you should supply one if you have an ordering column)
    FROM
        emp.employee AS T
)
UPDATE E SET
    statusDate = CASE
        WHEN E.RowNumberByEmployee <= 5 THEN '2019-06-01'
        WHEN E.RowNumberByEmployee BETWEEN 6 AND 10 THEN '2019-07-01'
        ELSE '2019-08-01' END
FROM
    EmployeeRowsWithRowNumbers AS E
WHERE
    E.RowNumberByEmployee <= 15