更新每个密钥的最新记录 - SQL

时间:2010-07-29 02:05:15

标签: sql-server

以下是我的数据

Key         Value       Date          STATUS
001         AAA          2010-01-01       E
001            BBB          2010-02-01       E
001            CCC          2010-03-01       E
002         XXX          2010-04-01       E
002            YYY          2010-05-01       E
002            ZZZ          2010-06-01       E
003         HHH          2010-03-01       E
003            GGG          2010-04-01       E 

我想用状态C(当前)更新给定密钥的最新记录。

如何使用Update Statement实现这一目标?

3 个答案:

答案 0 :(得分:0)

update table_name set status = 'C' where date = max(date);

答案 1 :(得分:0)

https://data.stackexchange.com/stackoverflow/query/8495/so3358976

-- SO3358976
-- update-lastest-record-for-each-key-sql

CREATE TABLE #temp ([Key] char(3) NOT NULL
, [Value] char(3) NOT NULL
, [Date] date NOT NULL
, [Status] char(1) NOT NULL) 

INSERT INTO #temp VALUES ('001', 'AAA', '2010-01-01', 'E')
,('001', 'BBB', '2010-02-01', 'E')
,('001', 'CCC', '2010-03-01', 'E')
,('002', 'XXX', '2010-04-01', 'E')
,('002', 'YYY', '2010-05-01', 'E')
,('002', 'ZZZ', '2010-06-01', 'E')
,('003', 'HHH', '2010-03-01', 'E')
,('003', 'GGG', '2010-04-01', 'E') 

;WITH Latest AS (
    SELECT [Key], MAX([Date]) AS LastDate FROM #temp GROUP BY [Key]
)
UPDATE t
SET [Status] = 'C'
FROM #temp AS t
INNER JOIN Latest
    ON t.[Key] = Latest.[Key]
    AND t.[Date] = Latest.[LastDate]​​​​​​​​​​

​SELECT * FROM #temp​

答案 2 :(得分:0)

我完成了

WITH DISTKEYS (KEYS)
AS (SELECT DISTINCT [KEY] FROM dbo.myTable)
UPDATE TargetTable
SET [status] = 'C'
FROM dbo.myTable AS TargetTable JOIN DISTKEYS ds ON TargetTable.[key] = ds.[keys]
WHERE [date] = (SELECT MAX([date]) FROM dbo.myTable WHERE [key] = ds.[keys])

由于