过滤修订订单号的最有效方法

时间:2017-04-07 13:43:40

标签: sql database tsql

我在过滤T-SQL数据库中的订单时遇到问题,我们使用的格式为" Q123456"分配订单号,并附加" -X" (X是修订号)。我需要删除所有较旧的版本(以及没有" -X"的原版),如果存在较新版本。

我知道我可以使用通配符,并相互检查字符串,但是我的所有答案看起来都非常低效,无法进行大量的比较。运行时间失控,非常快,我想有一个更好的结构可供使用。

提前感谢您,如果您需要更多信息,请告知我们,我会尽力提供。

编辑:示例数据,您有订单: Q123456 Q123456-1 Q123456-2 Q134567

由于存在Q123456-2,我需要从队列结果中删除Q123456和Q123456-1。 Q124567也将是一个结果,因为它是该订单的最新条目。

1 个答案:

答案 0 :(得分:0)

如果我们可以假设:

  • 所有订单的长度均为7个字符,除非它们有修订版....
  • 没有修订超过'-9',如果确实所有订单都显示为-xx,前导零(-01 ...- 10):如果不是,我们还需要做更多的工作。就像把顺序的最右边部分带到 - 然后将它转换为整数并按顺序排序,当不存在时分配0 -
  • Order_Num是您表格中的“ORDER_NUMBER。”

我们可以使用窗口函数和公用表表达式为每个order_Number系列生成行号(Q123456的Q123456,Q123456-1),然后只选择order_number最高的那个(按订单号desc排序)< / p>

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