2017-04-07 63 views
-2

我有一個問題,在我的T-SQL數據庫中過濾訂單,我們使用格式「Q123456」來分配一個訂單號碼,並附有「-X」(X是修訂號)。如果有更新版本的話,我需要消除所有舊版本(以及沒有「-X」的原版)。最有效的方法來過濾訂單號碼

我知道我可以爲此使用通配符,並且互相檢查字符串,但是我的所有答案都顯得效率極低,運行的對比次數很可笑。運行時間很快就會失控,我想有一個更好的結構可以利用。

先謝謝您,如果您需要更多信息,請告訴我,我會盡我所能提供。

編輯:示例數據,你有訂單: Q123456 Q123456-1 Q123456-2 Q134567

我需要從隊列中的搜索結果中刪除,因爲存在的Q123456和Q123456-1, Q123456-2。 Q124567也將是一個結果,因爲它是該訂單的最新條目。

+0

樣本數據和預期產量將他LP。 –

+1

在版本之前和之後添加一些示例表格 - 以及格式化文本。同時向我們展示您當前的查詢嘗試。 – jarlh

回答

0

如果我們可以假設:

  • 所有訂單的長度是7個字符,除非他們有一個版本....
  • 沒有修改超過「-9」,如果它確實顯示所有訂單作爲-xx與前導零(-01 ...- 10):如果不是,我們不得不做更多的工作。就像將訂單的最右邊部分放到 - 然後將其轉換爲整數並按順序排列,並在不存在時將其賦值爲0。
  • Order_Num是表中的「ORDER_NUMBER。

我們可以用一個窗口函數和一個公共表表達式生成每個ORDER_NUMBER系列只有一個行號(Q123456的Q123456,Q123456-1),然後選擇具有最高ORDER_NUMBER的一個(按貨號降序排列)

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 

沒有一個CTE ...

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