2016-07-13 17 views
2

SQL Serverストアドプロシージャ(Sql Azure上)を構築しています。要件のデータを生成できますが、私はそれをどうやって行うのか分かりません。2つ以上の値が競合した場合のSQL Serverストアドプロシージャの順序

次は、私は念のためにそこ(order by DateOfFile DESC)最新の最初から日付で注文する必要がありますが、

File | Description | DateOfFile | OrderOfLoad | BatchID 
--------+---------------+------------+-------------+---------  
ABC.DOC | a description | 2016-07-12 |  2  | 10 
DEF.PDF | a description | 2016-07-10 |  4  | 6 
GHI.DOC | a description | 2016-07-12 |  2  | 3 
XYZ.PDF | a description | 2016-07-10 |  1  | 7 
WWW.XLS | a description | 2016-05-01 |  5  | 15 

(これは、必要な列を持つランダムなデータである)まず、現時点ではクエリの結果であります同じ日付(AAAAMMDD)を持つ2つ以上のファイルで、次のように決定されます。最後のBatchId番号と最初のOrderOfLoad番号(2つ以上のファイルの日付と競合している場合のみ)注文は

  1. ABC.DOC ...(レコードの他の部分)
  2. GHI.DOC ...
  3. XYZ.PDF ...
  4. DEF.PDF ...
  5. WWW.XLS .. 。

あなたのうちのどれかが私にこれを達成するための方法、パフォーマンスに影響を与えないための良いものを導くことができる場合、私は感謝、私は(一時的なテーブルの上に本を挿入して、いくつかのループを作ることを考えていた好ましくありませんカーソル)が、今のところ私は考えがありません。

ありがとうございます。

+2

クエリはどのように見えますか? Order Byには1つ以上の列を含めることができます。 'Order By DateOfFile DESC、OrderOfLoad'など – christiandev

+0

また、同じ名前の2つのファイルがある場合は、両方を表示するか、最新のものだけを表示しますか? – christiandev

+0

こんにちは@christiandev、順序はセルジオの注文のように見えますが、私のケースでは、BatchIdとOrderOfLoadは、日付が2つ以上ある場合にのみ表示される必要があります。 –

答えて

7

BY句、あなたのためにこれを試してみてください:

ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad 
+0

こんにちは@sergio、私の注文はあなたのように見えますが、私の場合、BatchIdとOrderOfLoadは、日付が2つ以上ある場合にのみ表示されます。 –

+1

@DanyGそれは 'ORDER BY'はあなたが望むものをまさに行うでしょう。特定の 'DateOfFile'の値が1つしかない場合は、他の節は関係ないので、他には何も注文する必要はありません。 –

+0

@Sergioはいsr、それと同じくらいシンプルですが、あなたが提案したようにうまくいきます。私のエラーは、この単純な順序を動作させないようにした他のもの(質問には関係ありません)完璧。御時間ありがとうございます。 –

0

私は以前のコメントで述べたように、あなたが順に複数の列を持つことができ、クエリが左から右に優先順位を付けます...

したがって、文をORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoadに変更した場合は、DateOfFile、次にBatchId、最後にOrderOfLoadの順に並べ替えられます。

ただし、同じ日に2回ロードされた場合、同じファイル名が表示されます。あなたがその日の最新のファイルを表示したい場合は、何かが欠けている、あなたのファイルのログ表を見ることによってRow_Number() ...

WITH cteFiles 
      AS (
       SELECT [File] 
         ,[Description] 
         ,DateOfFile 
         ,OrderOfLoad 
         ,BatchID 
         ,rn = ROW_NUMBER() OVER (PARTITION BY [file], DateOfFile 
             ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad) 
       FROM  tablename 
      ) 
    SELECT [File] 
      ,[Description] 
      ,DateOfFile 
      ,OrderOfLoad 
      ,BatchID 
    WHERE rn = 1 
+0

こんにちは@christiandev、ご協力いただきありがとうございます。私はSergioのクエリで解決することができましたが、これは私に似た何かのために必要な別のSPに役立ちます。 –

0

を使用することができます。

Sergioとして、クエリは出力を提供します。より堅牢なものにするために、batchIDをユニークに作成することができます。これはBatchDateに関連しているため、より効率的に出力を取得するようクエリできます。

+0

お時間をありがとう。 –