使用SQL Server 2008,Visual Studio 2012 C#.NET4.5,win-forms
我有一个包含20个记录的数据网格,他们的一个字段调用“NewPareto”这个字段包含1-20作为整数,基本上是一个联盟得分。请注意,此字段必须允许空值。
如果网格中的用户将位置9更改为位置3,我需要一个查询,在更新后的位置后求助记录,基本上我只想增加1。
然而,我发现这不起作用,因为总是有9个曾经存在的差距,如果我说任何大于3的东西,那么已经存在3个。
我正在考虑将原来的3改为4然后再说增量> 4.但是这仍然没有理清9,除此之外,当将低数字交换为高时似乎逻辑不起作用。
我已经尝试了一些查询,即最新版本也不起作用。
ALTER PROCEDURE [dbo].[IncrimentPareto]
@pg varchar(255),
@Pareto int,
@paretostatic int
AS
;With cte as
(select top 1000000 *
from ParetoMain
where PG = @pg and
NewPareto > @paretostatic and
NewPareto is not null
order by Sales desc )
UPDATE cte
SET @Pareto = NewPareto = @Pareto +1
这几乎可行,但现在仍然存在两个3,它只能在位置8之后工作,因为9不存在。
希望你的脑袋不会像我一样疲惫不堪。
摘要:在某个位置向上或向下移动联盟之后,用新联盟数字对记录进行排序的查询
答案 0 :(得分:1)
您可以使用单个更新语句来执行此操作,该语句仅使用row_number函数更新pareto更改的行,并进行一些明智的子查询:
DECLARE @from int = 9, @to int = 3
UPDATE MainPareto
SET pareto = m.new_pareto
FROM (
SELECT pKey, -- this is your primary key for the table
new_pareto = row_number()
over(ORDER BY CASE WHEN pareto = @from THEN @to ELSE pareto END,
CASE WHEN pareto = @from THEN 0 ELSE 1 END)
FROM MainPareto
-- put in any conditions that you want to restrict the scores by.
WHERE PG = @pg AND pareto IS NOT NULL
-- end condtions
) as m
INNER JOIN MainPareto ON MainPareto.pKey = m.pKey
WHERE MainPareto.pareto <> m.new_pareto
新的帕累托的“row_number()over order”的order by子句,优先于新条目。如果您希望旧版本保持其领先优势,请交换第二个order by子句中的0和1。
答案 1 :(得分:1)
此外,您可以使用选项与CTE和ROW_NUMBER()排名功能
DECLARE @Pareto int = 2,
@NewPareto int = 5
;WITH cte AS
(
SELECT ID, ROW_NUMBER() OVER (ORDER BY CASE WHEN Pareto = @Pareto THEN @NewPareto ELSE Pareto END) AS Pareto, Col1
FROM dbo.test87
WHERE Pareto != @Pareto
),cte2 AS
(
SELECT ID, Pareto, @NewPareto AS NewPareto, Col1
FROM dbo.test87
WHERE Pareto = @Pareto
UNION ALL
SELECT ID, Pareto, CASE WHEN Pareto >= @NewPareto THEN Pareto + 1 ELSE Pareto END, Col1
FROM cte
)
UPDATE t
SET t.Pareto = c.NewPareto
FROM dbo.test87 t JOIN cte2 c ON t.ID = c.ID
SQLFIddle上的演示