我刚刚在我的桌子上创建了一个列调用UPDATE,我想根据我的数据填写它。
每当一个对象从主键(ID,YEAR)更改时,我想更新列UPDATE
|| ID || YEAR || OBJECT || UPDATE
1 2010 1 2010
2 2010 2 2010
3 2011 3 2011
1 2011 1 2010
2 2011 1 2011
3 2011 1 2011
我不知道我有多少查询和多年。但我只有很少的对象
我很感激你的帮助
答案 0 :(得分:1)
根据您提供的示例,这是应该提供UPDATE列的SQL,如问题所示。
UPDATE t
SET UPDATE=ISNULL(minyear.[MinYear],Year)
FROM Table t
LEFT JOIN (
SELECT ID,OBJECT,MIN(YEAR) [MinYear]
FROM TABLE
GROUP BY ID,OBJECT
) minyear on minyear.ID=t.ID
AND minyear.OBJECT=t.OBJECT
答案 1 :(得分:1)
如果您使用的是SQL Server 2012+,则可以使用LAG
获取之前的值:
;WITH ToUpdate AS (
SELECT ID, YEAR, OBJECT, [UPDATE],
COALESCE(LAG(YEAR) OVER (PARTITION BY OBJECT
ORDER BY YEAR, ID),
YEAR) AS prevYear
FROM mytable
)
UPDATE ToUpdate
SET [UPDATE] = prevYear
在CTE
上执行的更新将传播到真实数据库表。因此,UPDATE
操作会使用前一条记录的值填充[UPDATE]
字段。
注意:LAG
获取上一行行的YEAR
值,由ORDER BY YEAR, ID
子句定义。如果没有先前的值,则[UPDATE]
设置为等于同一记录的YEAR
值。