2017-04-07 5 views
-2

T-SQLデータベースの注文をフィルタリングする際に問題があります。注文番号を割り当てるために "Q123456"という形式を使用します。これには "-X"(X改訂番号です)。新しいバージョンが存在する場合、古いリビジョン(および "-X"なしのオリジナル)をすべて削除する必要があります。改訂された注文番号をフィルタリングする最も効率的な方法

私はこれにワイルドカード文字を使用し、文字列を互いに照合することができますが、私の回答はすべて非常に効率が悪く思われます。実行時間は非常に迅速に制御から外れ、私は利用するはるかに良い構造があると思います。

これ以上の情報が必要な場合は、事前にお知らせください。私はそれを提供するために最善を尽くします。

EDIT:例のデータは、あなたが注文を持っている:私は理由が存在する、キューの結果から、Q123456とQ123456-1を削除する必要が Q123456 Q123456-1 Q123456-2 Q134567

Q123456-2。 Q124567も、その注文の最新のエントリであるため、結果になります。

+0

サンプルデータと予想される出力を選択しますlp。 –

+1

バージョンの前後にいくつかのサンプル・テーブルを追加します。フォーマット・テキストも同様です。現在のクエリの試行も表示してください。 – jarlh

答えて

0

我々が想定できる場合は、次のすべての注文は、彼らがリビジョンを持っている場合を除き、長さは7つの文字....

  • ある

    • 何のリビジョンが「-9」を超えていないと、それがない場合はすべての注文が表示されます先頭にゼロを付けた-xx(-01 ...- 10):そうでなければ、もう少し作業をしなければなりません。同様に、順序の右端部分を - に渡し、それを整数と順序にキャストし、存在しない場合は0を代入します。
    • 列order_numは、テーブル内の「ORDER_NUMBERです。

    私たちは、その行の各ORDER_NUMBERシリーズの番号(Q123456のQ123456、Q123456-1)のみを生成する窓関数と共通テーブル式を使用することができます彼は(注文をnum DESC順)最高ORDER_NUMBERと1 CTEなし

    With CTE AS (SELECT A.*, Row_number() over (PARTITION BY substring(Order_Num,1,7) 
                  ORDER BY order_num Desc) RN 
          FROM table) 
    Select * from cte where RN = 1 
    

    ...

    SELECT * 
    FROM (SELECT A.*, Row_number() over (PARTITION BY substring(Order_Num,1,7) 
                ORDER BY order_num Desc) RN 
         FROM table) 
    WHERE RN = 1 
    
  • +0

    これは完璧だと思いますが、難なくCTEに収まるはずです。どうもありがとうございました。あなたは大きな頭痛から私を救ってくれました。すべてをすべてと比較するよりはるかに効率的です。 – Kishi

    +0

    パフォーマンスが問題であれば、order_Num 1,7は常にすでにすでに切り離されているので、更新時のコストで実行時間の計算を無効にするように、計算された列をテーブルに追加することができます。 – xQbert

    関連する問題