0

同様の質問がすでにここで尋ねられています。しかし、現在のシナリオは以前より少し複雑です。この例では、if same Itimethen でケースごとに並べ替えることができますが、ifItimeと result が同じ場合、どうすれば並べ替えることができますか?

私の質問は、結果 ID: 3,5,6,1,2,7,8,4 です。失敗の場合はなぜ 2,7,8 なのか。

なぜ8、2、7ではないのですか?

次のような期待される結果が必要な場合: 3,5,1,6,8,2,7,4 どうすればよいですか?

以下のコマンドを実行して、並べ替えを手伝ってください。前もって感謝します。

if object_id('tempdb.dbo.#temp321','U') is not null
   drop table tempdb.dbo.#temp321

create table #temp321(id int, uname varchar(50), current_point int, 
                      previous_point int, ITime datetime, Result varchar(10))

INSERT into #temp321 values('1','a','50','40','2012-11-12 13:12:28.103','pass')
INSERT into #temp321 values('2','b','15','10','2012-11-12 13:12:28.103','fail')
INSERT into #temp321 values('3','c','71','70','2012-11-12 12:58:30.000','pass')
INSERT into #temp321 values('4','d','34','30','2012-11-12 13:12:28.103','withdraw')
INSERT into #temp321 values('5','e','40','35','2012-11-12 12:58:41.360','withdraw')
INSERT into #temp321 values('6','f','65','60','2012-11-12 13:12:28.103','pass')
INSERT into #temp321 values('7','g','20','15','2012-11-12 13:12:28.103','fail')
INSERT into #temp321 values('8','h','10','7','2012-11-12 13:12:28.103','fail')


select 
    ID 
from 
    #temp321 
ORDER BY 
    ITime ASC,
    CASE Result 
       WHEN 'pass' THEN 1 
       WHEN 'fail' THEN 2 
       WHEN 'withdrow' THEN 3 
    END 

drop table #temp321 
  • 現在の出力 ID: 3,5,6,1,2,7,8,4
  • 予想される出力 ID: 3,5,1,6,8,2,7,4
4

2 に答える 2

5

現在のクエリは、毎回同じ注文を配信するわけではありません。

私にとってあなたの例は以下を提供します:

3, 5, 1, 6, 2, 7, 8, 4 (Note 1 and 6 being swapped)

1と6は、ソートを考慮したソート値と比較して「等しい」です。そして、ソートが指定されていない場合(または同等のソート)、その束内の順序は-定義ごとに-未定義です。(スレッドがデータを作成した順序によって異なります)

同じことが。にも当てはまります2, 7, 8。あなたは順序が欲しいのです3, 5, 1, 6, 8, 2, 7, 4-それであなたはそれがどのようにソートされることを期待するかという論理を「持っている」ように見えますか?次に、その条件を追加すると、完了です:)

(期待される出力の場合、current_pointを追加することが必要ですが、その列で並べ替える必要があるかどうかを知る必要があります)

SELECT * 
FROM temp321 
ORDER BY ITime ASC,
  CASE Result 
    WHEN 'pass'     THEN 1 
    WHEN 'fail'     THEN 2 
    WHEN 'withdraw' THEN 3 
  END, current_point ASC
于 2012-11-13T09:27:07.160 に答える
0

キーと値のペアとしてサブクエリを作成できます。

   SELECT 'pass' value, 1 priority UNION ALL         
   SELECT 'fall' value, 2 priority UNION ALL
   SELECT 'withdraw' value, 3 priority UNION ALL

次に、値列のサブクエリに結合し、優先順位に従って並べ替えます。これにより、よりクリーンなソリューションが得られます。ルックアップ値が多数ある場合は、速度が適切であることを確認するために、値によって一時テーブルとインデックスを作成することもできます。

于 2012-11-13T10:34:28.723 に答える