【发布时间】:2017-12-28 04:14:36
【问题描述】:
我有一个关于产品的大型车辆装配信息数据集,每一个都在自己的行中。 我正在努力创建一个查询以仅选择每个重叠条目的最小和最大年份。 比如我有这样的数据:
fromyear toyear makename modelname submodelname wheelbase BedLength BedTypeName bodytype note1 Note2 note3 partterminologyname exppartno
2008 2012 Chevrolet Silverado 1500 LT NULL 78.00 Fleetside NULL Black NULL NULL Truck Bed Mat 37807
2010 2010 Chevrolet Silverado 1500 LT NULL 78.00 Fleetside NULL Black NULL NULL Truck Bed Mat 37807
2014 2017 Chevrolet Silverado 1500 LT NULL 78.00 Fleetside NULL Black NULL NULL Truck Bed Mat 37807
我不关心保留数据,因此我通过选择最小和最大年份将注意力转移到 UPDATE 查询上,但添加了类似
(SELECT MIN(p2.fromyear)
FROM prod AS p2
WHERE p1.fromyear > 0
AND p2.toyear >= p1.fromyear
AND p2.fromyear < p1.fromyear
AND ISNULL(p2.makename, '') = ISNULL(p1.makename, '')
AND ISNULL(p2.modelname, '') = ISNULL(p1.modelname, '')
AND ISNULL(p2.submodelname, '') = ISNULL(p1.submodelname, '')
AND ISNULL(FLOOR(p2.wheelbase), 0) = ISNULL(FLOOR(p1.wheelbase), 0)
AND ISNULL(FLOOR(p2.BedLength), 0) = ISNULL(FLOOR(p1.BedLength), 0)
AND ISNULL(p2.BedTypeName, '') = ISNULL(p1.BedTypeName, '')
AND ISNULL(p2.bodytype, '') = ISNULL(p1.bodytype, '')
AND ISNULL(p2.note1, '') = ISNULL(p1.note1, '')
AND ISNULL(p2.Note2, '') = ISNULL(p1.Note2, '')
AND ISNULL(p2.note3, '') = ISNULL(p1.note3, '')
AND ISNULL(p2.exppartno, '') = ISNULL(p1.exppartno, '')) AS newfrom
导致查询运行时间过长(从具有超过 150k 行的表中提取)。 在执行 UPDATE 合并年份后,我可以简单地删除任何重复的行。
所需结果将只返回此模型的两行,2008-2012 和 2014-2017
我最初的想法是简单地选择 MIN(fromyear) 和 MAX(toyear),但这给我留下了一个问题,即选择无效的 2013 年。
有没有一些简单的方法来制定一个查询来处理这样的重叠年份?我在搜索中找到的所有内容都不涉及匹配多列数据。
【问题讨论】:
-
如果您还可以向我们展示更新后的表格是什么样子(选择?),那将非常有帮助。目前尚不清楚您在这里实际想要做什么。
标签: sql-server