1

私の SQL テーブルには、私の問題に影響を与える 2 つのフィールドがあります。ユーザーがテーブルに項目を追加するとき、特定の Start_Date の優先度を指定します。

Item1 が優先度 1 の場合、Item2 は優先度 2 である可能性があり、Item1 の後に Start_Date が与えられます。

ただし、Item2 に優先度 0.5 (または Item1 の優先度よりも小さい任意の数値) が与えられた場合、その Start_Date はItem 1 の Start_Dateより前になります。

各アイテムが追加された後、アイテムのリストを調べてすべての優先度を更新して、優先度 = 1 の最も古い Start_Date から始まり、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

あなたの問題で私が理解できないことの1つは、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()

それらが一意でない場合、同じ優先度 (DateTimes が同じ) を持つ行がいくつか取得され、優先度シーケンスにいくつかのギャップが生じます...

于 2009-11-03T20:11:15.850 に答える