我的表在两列中具有相同的值。我想只更新一行login
和email
中的值相同且data modification
更早的行。因此,在下面的示例中,它必须仅使用ID = 2
更新一行。我应该使用什么SQL语句?
ID | login |email |data modification
---|---------|---------------------|-----------------
1 | abc |john@mail.com | 2017-01-10
2 | abc |john@mail.com | 2017-02-14
3 | example |john123@hotmail.com | 2017-02-17
答案 0 :(得分:4)
一种方法是使用cte获取每个data modification
和Login
组合的第一条记录(基于Email
):
;WITH CTE AS
(
SELECT Id,
ROW_NUMBER() OVER(PARTITION BY Login, Email ORDER BY [data modification]) as rn
FROM <Table>
)
UPDATE t
SET <column> = <value>
FROM <Table> t
INNER JOIN CTE ON t.Id = CTE.Id
WHERE rn = 1
如果您使用的是2012或更高版本,则可以使用First_Value
编写更短的内容:
;WITH CTE AS
(
SELECT FIRST_VALUE(Id) OVER(PARTITION BY Login, Email ORDER BY [data modification]) as FirstId
FROM <Table>
)
UPDATE t
SET <column> = <value>
FROM <Table> t
INNER JOIN CTE ON t.Id = CTE.Id