我需要弄清楚如何从我的查询结果中删除旧版本,我的数据库将订单存储为' 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'的存在修订。我一直在努力弄清楚如何做到这一点,我的直接想法是使用案例陈述,但我不确定实施它们的最佳方式是什么以及如何过滤。提前感谢您,如果需要更多信息,请与我们联系。
答案 0 :(得分:0)
首先,您必须使用CHARINDEX和SUBSTRING(或更新版本中的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
...
然后您可以使用
例如,使用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