3

使用 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 不存在。

希望你的头不会像我的一样疲惫。

摘要:在某个位置上移或下移联盟后,对具有新联盟编号的记录进行排序的查询

4

2 回答 2

1

您可以使用单个更新语句来执行此操作,该语句仅使用 row_number 函数更新帕累托更改的行,以及一些明智的子查询:

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 by 子句按新的排列顺序排列,优先于新条目。如果您希望较旧的保持领先,请交换第二个 order by 子句的 0 和 1。

于 2013-04-16T10:02:33.837 回答
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上的演示

于 2013-04-18T07:44:57.630 回答