1

我的 SQL 表有 2 个字段会影响我的问题:“优先级”是真实的,Start_Date 是日期时间。当用户将项目添加到表中时,(s)他为给定的 Start_Date 指定优先级。

如果 Item1 是 Priority 1,那么 Item2 可能是 Priority 2,它会在 Item 1 之后被赋予 Start_Date。

但是如果 Item2 的优先级为 0.5(或任何小于 Item1 的优先级的数字),那么它的 Start_Date 将Item 1 的 Start_Date 之前。

添加每个项目后,我想遍历项目列表并更新所有优先级,使其成为整数,从最早的 Start_Date 开始,优先级 =1,然后是 2、3 等。

我正在使用 SQL 2005。我知道我可以用游标来做到这一点。有没有更好的办法?怎么会这样?

谢谢你。

4

3 回答 3

0

您可以使用临时表执行此操作。可能有更好的方法,但我现在想不出一个。这还假设您的表上有一个主键 - 如果它只是开始日期和优先级,那么这个解决方案将不可行。

create table #tempOrder (newPriority int identity,
                         id int)

insert into #tempOrder (id) select id from table order by Start_Date

update table set priority = newPriority 
  from #tempOrder
  where #tempOrder.id = table.id

我对您的问题不理解的一件事是提到了 0.5 的优先级。您提到优先级是按开始日期的顺序分配的,但也提到手动将优先级设置为 0.5。这什么时候会发生?如果该优先级的开始日期与开始日期的优先级顺序冲突,应该采取什么行为?

于 2009-11-03T20:07:22.000 回答
0
UPDATE mt
SET Priority = 
    (
     SELECT COUNT(*) 
     FROM MyTable mt2 
     WHERE mt2.Start_Date <= mt.Start_Date
    )
FROM MyTable mt
于 2009-11-03T20:10:44.380 回答
0

如果所有的 startdatetimes 都是唯一的,试试这个(在 Begin Trans 里面,这样你就可以查看结果并在它不是你想要的时候回滚)

   Update Table Set 
     Priority = (Select Count(*) From table 
                 Where Start_Date <= T.Start_Date)
   From Table T
   Where Start_Date > getDate()

如果它们不是唯一的,您将获得一些具有相同优先级的行(其中日期时间相同)和优先级序列中的一些间隙......

于 2009-11-03T20:11:15.850 回答