谁能帮我写一个SQL语句吗?

谁能帮我写一个SQL语句吗?,sql,Sql,下表所示为: aID | bID | idx 1 | 1 | 0 2 | 2 | 0 2 | 3 | 1 3 | 1 | 0 4 | 2 | 0 4 | 3 | 1 4 | 4 | 2 是否可以仅使用DELETE和UPDATE语句而不使用游标来获得以下结果 aID | bID | idx 1 | 1 | 0 2 | 2 | 0 2 | 3 | 1 4 | 4 | 0 每种援助都应有一份独特的投标清单。id

下表所示为:

aID | bID | idx
1   | 1   | 0
2   | 2   | 0
2   | 3   | 1
3   | 1   | 0
4   | 2   | 0
4   | 3   | 1
4   | 4   | 2
是否可以仅使用DELETE和UPDATE语句而不使用游标来获得以下结果

aID | bID | idx
1   | 1   | 0
2   | 2   | 0
2   | 3   | 1
4   | 4   | 0
每种援助都应有一份独特的投标清单。idx列只描述列表的顺序


我想删除所有多个出价,只保留最低援助的出价。然后根据需要更新其余行的idx


提前感谢。

使用相关子查询

select t.* from your_table t 
where aID = (select min(aID) from your_table t1 
             where t1.bID=t.bID
            )

使用相关子查询

select t.* from your_table t 
where aID = (select min(aID) from your_table t1 
             where t1.bID=t.bID
            )

这似乎起到了作用:

declare @t table (aID int, bID int, idx int)
insert into @t(aID,bID,idx) values
(1,1 ,0 ),
(2,2 ,0 ),
(2,3 ,1 ),
(3,1 ,0 ),
(4,2 ,0 ),
(4,3 ,1 ),
(4,4 ,2 )

delete
    t1
from @t t1
where exists (select * from @t t2 where t2.bID = t1.bID and t2.aID < t1.aID)

;With Numbered as (
    select *,ROW_NUMBER() OVER (PARTITION BY aID ORDER by bID) -1 as newIdx
    from @t
)
update Numbered set idx = newIdx

select * from @t
(请注意,我已经使用SQL Server对此进行了测试-您没有对问题应用任何特定于产品的标记-表变量语法是非标准的,
delete…from
有点可疑,但其余是标准SQL)


1一般经验法则是只存储基础数据,而不存储派生数据。通过单独存储派生数据,可以使计算值与基础数据不同步


第二条经验法则是,如果必须存储派生数据,最好让数据库引擎负责维护,而不是自己。但通常只有在计算成本过高,并且你严重偏向读者而非作者的情况下,才能这样做。

这似乎可以做到:

declare @t table (aID int, bID int, idx int)
insert into @t(aID,bID,idx) values
(1,1 ,0 ),
(2,2 ,0 ),
(2,3 ,1 ),
(3,1 ,0 ),
(4,2 ,0 ),
(4,3 ,1 ),
(4,4 ,2 )

delete
    t1
from @t t1
where exists (select * from @t t2 where t2.bID = t1.bID and t2.aID < t1.aID)

;With Numbered as (
    select *,ROW_NUMBER() OVER (PARTITION BY aID ORDER by bID) -1 as newIdx
    from @t
)
update Numbered set idx = newIdx

select * from @t
(请注意,我已经使用SQL Server对此进行了测试-您没有对问题应用任何特定于产品的标记-表变量语法是非标准的,
delete…from
有点可疑,但其余是标准SQL)


1一般经验法则是只存储基础数据,而不存储派生数据。通过单独存储派生数据,可以使计算值与基础数据不同步


第二条经验法则是,如果必须存储派生数据,最好让数据库引擎负责维护,而不是自己。但通常只有在计算成本高得让人望而却步,而且你对读者而不是作者有很大偏见的情况下,才会这样做。

你忽略了描述你的逻辑,我们需要回答你的问题。你尝试了什么?使用哪种数据库管理系统?所以,你的标题是你总结问题并向潜在的回答者“推销”你的问题的机会。目前,你的标题是如此通用,它可以适用于几乎任何问题,这是标记我想删除所有多个出价,只有保持最低的援助出价。然后根据需要更新剩余行的idx。好的……但是我仍然没有得到
idx
部分。你能解释一下为什么我们在预期输出中看到这4个值吗?你忽略了描述你的逻辑,我们需要回答你的问题。你尝试了什么?使用哪种数据库管理系统?所以,你的标题是你总结问题并向潜在的回答者“推销”你的问题的机会。目前,你的标题是如此通用,它可以适用于几乎任何问题,这是标记我想删除所有多个出价,只有保持最低的援助出价。然后根据需要更新剩余行的idx。好的……但是我仍然没有得到
idx
部分。您能解释一下为什么我们在预期输出中看到这4个值吗?谢谢您,先生:)谢谢你,先生:)