根据修订消除条目

时间:2017-05-05 13:34:48

标签: sql database tsql

我需要弄清楚如何从我的查询结果中删除旧版本,我的数据库将订单存储为' Q000000'和修订版附加了' -number'。我的查询目前如下:

SELECT DISTINCT Estimate.EstimateNo
FROM Estimate 
INNER JOIN EstimateDetails ON EstimateDetails.EstimateID = Estimate.EstimateID
INNER JOIN EstimateDoorList ON EstimateDoorList.ItemSpecID = EstimateDetails.ItemSpecID
WHERE (Estimate.SalesRepID = '67' OR Estimate.SalesRepID = '61') AND Estimate.EntryDate >= '2017-01-01 00:00:00.000' AND EstimateDoorList.SlabSpecies LIKE '%MDF%'
ORDER BY Estimate.EstimateNo

例如,结果将包括:

Q120455-10
Q120445-11
Q121675-2
Q122361-1
Q123456
Q123456-1

由此,我需要消除' Q120455-10'因为' -11'对于该订单,' Q123456'因为' -1'的存在修订。我一直在努力弄清楚如何做到这一点,我的直接想法是使用案例陈述,但我不确定实施它们的最佳方式是什么以及如何过滤。提前感谢您,如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

首先,您必须使用CHARINDEXSUBSTRING(或更新版本中的STRING_SPLIT)和CAST/CONVERT将您的EstimateNo列解析为序列号和版本号修订为数字类型

SELECT 
SUBSTRING(Estimate.EstimateNo,0,CHARINDEX('-',Estimate.EstimateNo)) as [EstimateNo], 
CAST(SUBSTRING(Estimate.EstimateNo,CHARINDEX('-',Estimate.EstimateNo)+1, LEN(Estimate.EstimateNo)-CHARINDEX('-',Estimate.EstimateNo)+1) as INT) as [EstimateRevision]
FROM
...

然后您可以使用

  1. APPLY - 选择与EstimateNo或
  2. 匹配的TOP 1行
  3. Window function,例如ROW_NUMBER,仅选择行号为1的记录
  4. 例如,使用ROW_NUMBER看起来如下所示:

    SELECT 
    ROW_NUMBER() OVER(PARTITION BY EstimateNo ORDER BY EstimateRevision DESC) AS "LastRevisionForEstimate",
    -- rest of the needed columns
    FROM
    (
    -- query above goes here
    )
    

    然后,您可以将上面的查询包装在一个简单的选择中,其中where谓词过滤掉LastRevisionForEstimate的特定值,例如

    SELECT --needed columns
    FROM -- result set above
    WHERE LastRevisionForEstimate = 1
    

    请注意,这在某种程度上是伪代码,因为我没有您的架构且无法测试查询

    如果您不喜欢嵌套选择,请查看Common Table Expressions