![](/img/trans.png)
[英]In VBA Excel through ADO SQL, How may I refer to a record “only once” and link it to another avoiding the same record to be recalled?
[英]How do I refer to a record in sql that immediately precedes another record in a group?
我有一个奇怪的更新查询要写。
这是桌子
PK-ID (int) --- FK-ID (int) --- Value (int)
在我的数据集中,如果我按FK-ID分组并按PK-ID排序,则假设这是一个组的示例:
5 --- 10 --- 23
7 --- 10 --- 49
8 --- 10 --- 81
由于某些旧软件存在错误,记录7和8的值不正确。 7的正确值为(49-23)= 26,8的正确值为(81-49)=32。记录5是正确的。
当按FK-ID分组并按PK-ID排序时,我需要更新每条记录以减去紧接在它前面的记录的值。 如果没有先前的记录,则不需要更改该值。
有没有一种方法可以编写一般的sql更新查询来完成此任务? 我如何(有条件地)检索组中先前记录的值? 我正在使用SQL Server 2008。
谢谢!
with ordered as (
select *, rn = row_number() over (partition by fk_id order by pk_id)
from tbl
)
update cur
set value = cur.value - prior.value
from ordered cur
join ordered prior on prior.fk_id = cur.fk_id
and prior.rn = cur.rn-1;
我认为这是正确的答案,使用了与上一个类似的想法。 toupdate子查询根据问题中的规则(具有相同外键和连续主键的更新记录)计算值。 它确实假定id是某种数字值。
with toupdate as (
select t.pkid, t.value - tprev.value as newval
from t join
t tprev
on t.pkid = tprev.pkid+1 and t.fkid = tprev.fkid
)
update t
set value = newvalue
from toupdate
where t.pkid = toupdate.pkid
我希望它可以返回您想要的内容(对不起,我暂时无法尝试); 您只需要将其与UPDATE
合并
WITH cte1 AS
(SELECT pk_id, fk_id, value, ROW_NUMBER() OVER (PARTITION BY fk_id ORDER BY pk_id DESC)
as num
FROM your_table
)
SELECT a.*,
--CASE
-- WHEN b.pk_id IS NOT NULL THEN a.value-b.value
-- ELSE 0 END
a.value-b.value as valid_number
FROM cte1 a
--LEFT JOIN cte1 b ON (b.fk_id = a.fk_id AND b.num = a.num-1)
INNER JOIN cte1 b ON (b.fk_id = a.fk_id AND b.num = a.num-1)
update t set value = value -
isnull((select top 1 value
from t t2
where t2.FKID=t.FKID
and t2.PKID<t.PKID
order by PKID desc),0);
这是一个SQLFiddle演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.