Sql 基于行的另一个值更新行的值列
我有一个历史数据表,数据如下: 在我的情况下,Sql 基于行的另一个值更新行的值列,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一个历史数据表,数据如下: 在我的情况下,产品id(110111112)改变了价格,这样我就拥有了具有产品更新日期值的相同产品,有时我也可以拥有相同的重复数据,而不改变任何信息 +------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+ | id
产品id
(110111112)改变了价格
,这样我就拥有了具有产品更新日期
值的相同产品,有时我也可以拥有相同的重复数据,而不改变任何信息
+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
| id | product_id | product_name | product_Price | product_addDate | product_UpdateDate | Insertdate_DB | Updatedate_DB |
+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
| 1 | 110 | DELL | 1000 | 2017-03-01 08:00:00.000 | NULL | 2017-03-06 10:00:00.000 | NULL |
| 2 | 111 | HP | 900 | 2017-03-01 08:00:00.000 | NULL | 2017-03-06 10:00:00.000 | NULL |
| 3 | 112 | Mac | 1300 | 2017-03-01 08:00:00.000 | NULL | 2017-03-06 10:00:00.000 | NULL |
| 4 | 113 | Lenovo | 950 | 2017-03-01 08:00:00.000 | NULL | 2017-03-06 10:00:00.000 | NULL |
| 5 | 110 | DELL | 900 | 2017-03-04 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL |
| 6 | 111 | HP | 800 | 2017-03-04 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL |
| 7 | 112 | Mac | 120 | 2017-03-04 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-07 10:00:00.000 | NULL |
+------+------------+--------------+---------------+-----------------------------+-------------------------+-------------------------+----------------+
我想要的是执行更新查询以获得如下结果:
+----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
| id | product_id | product_name | product_Price | product_addDate | product_UpdateDate | Insertdate_DB | Updatedate_DB |
+----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
| 1 | 110 | DELL | 1000 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE() |
| 2 | 111 | HP | 900 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE() |
| 3 | 112 | Mac | 1300 | 2017-03-01 08:00:00.000 | 2017-03-04 08:00:00.000 | 2017-03-06 10:00:00.000 | GETDATE() |
| 4 | 113 | Lenovo | 950 | 2017-03-01 08:00:00.000 | NULL | 2017-03-06 10:00:00.000 | NULL |
| 5 | 110 | DELL | 900 | 2017-03-04 08:00:00.000 | NULL | 2017-03-07 10:00:00.000 | NULL |
| 6 | 111 | HP | 800 | 2017-03-04 08:00:00.000 | NULL | 2017-03-07 10:00:00.000 | NULL |
| 7 | 112 | Mac | 120 | 2017-03-04 08:00:00.000 | NULL | 2017-03-07 10:00:00.000 | NULL |
+----+------------+--------------+---------------+-------------------------+-------------------------+-------------------------+---------------+
下面的查询可以更新产品\u UpdateDate
update tablename
set product_UpdateDate = case when tablename.product_UpdateDate is null
then t.product_UpdateDate
else null end
from tablename
join tablename t
on tablename.product_id = t.product_id
and t.ID <> tablename.id `
更新表名
当tablename.product\u UpdateDate为空时,设置product\u UpdateDate=大小写
然后t.product_更新
else空端
从表名
联接表名
在tablename.product\u id=t.product\u id上
和t.ID tablename.ID`
但是,当我尝试更新此列时,我还想用GETDATE()
值更改Updatedate\u DB
,所有行都有值GETDATE()
,但我只想更改值已更改的行
感谢您的帮助我认为行号()
可能是一种更简单的方法。这一逻辑很难理解,但以下应该是您问题中的数据:
with toupdate as (
select t.*,
row_number() over (partition by product_id order by id) as seqnum,
count(*) over (partition by product_id) as cnt
from t
)
update toupdate
set product_UpdateDate = (case when seqnum = 1 then product_addDate end),
Updatedate_DB = (case when seqnum = 1 then getdate() end)
where cnt > 1;
感谢回复,这是工作,但有一个问题是,当我下次执行查询时,
Updatedate_DB
更改信息我的情况我不想更改Updatedate_DB
,即使我多次执行查询,因为我将在SSIS包中使用查询
@Mark。这听起来像是一个不属于这个问题的要求。也许你应该问另一个问题,提供合适的数据和期望的结果。