SQL 服务器 Return 总匹配项中仅 1 行
SQL Server Return just 1 row from total matches
我进行了一个查询,将我们仓库中产品的产品尺寸与我们新库存位置的尺寸相匹配。下面的示例输出:
ArticleNr Location Packaging StockAtLocation NewPackaging Ranking
0012953 A15074E03 MB 235 33 10
0012953 A15074E03 MB 235 E2 11
0012953 A15074E03 MB 235 E3 12
0012953 A15074E03 MB 235 KK 13
0012953 A15074E03 MB 235 C4 14
0066487 A20057A03 KK 12 KK 13
0066487 A20057A03 KK 12 C4 14
示例:产品 0012953 当前包装在 'MB' 中,但在新仓库中它可以放入 33、E2、E3、KK 和 C4。如果它可以放在多个位置,它应该进入排名最低的位置。在这种情况下,它应该进入排名 10 的 NewPackaging“33”。
产品 0066487 应该去 KK,排名 13。
如何将查询调整为仅 returns 每个 ArticleNr 排名最低的记录?
期望的输出:
ArticleNr Location Packaging StockAtLocation NewPackaging Ranking
0012953 A15074E03 MB 235 33 10
0066487 A20057A03 KK 12 KK 13
查询:
SELECT
t1.ArticleNr,
t1.Location AS Location,
t1.StorageMedium AS Packaging,
t1.StockAtLocation,
t2.Verpakking AS NewPackaging,
t2.Ranking
FROM #Info t1,
#Dimensions t2
WHERE t1.Length < t2.Lengte
AND t1.Width < t2.Breedte
AND t1.Height < t2.Hoogte
AND t1.Volume < t2.MaxVol
AND (t1.PartWeightGross / 1000) < t2.MaxWeightArt
AND (t1.Volume * t1.StockAtLocation) < t2.MaxVol
AND ((t1.PartWeightGross / 1000) * t1.StockAtLocation) < t2.MaxWeightEmb
Order by ArticleNr asc, Ranking asc
在 Select 和 select 中添加一个 ROW_NUMBER,其中 Row_number = 1。
;with cte
as
(
SELECT
RN = ROW_NUMBER() OVER(PARTITION BY t1.ArticleNr ORDER BY ArticleNr asc, Ranking asc),
t1.ArticleNr,
t1.Location AS Location,
t1.StorageMedium AS Packaging,
t1.StockAtLocation,
t2.Verpakking AS NewPackaging,
t2.Ranking
FROM #Info t1,
#Dimensions t2
WHERE t1.Length < t2.Lengte
AND t1.Width < t2.Breedte
AND t1.Height < t2.Hoogte
AND t1.Volume < t2.MaxVol
AND (t1.PartWeightGross / 1000) < t2.MaxWeightArt
AND (t1.Volume * t1.StockAtLocation) < t2.MaxVol
AND ((t1.PartWeightGross / 1000) * t1.StockAtLocation) < t2.MaxWeightEmb
)
select
*
from cte
where rn = 1
我进行了一个查询,将我们仓库中产品的产品尺寸与我们新库存位置的尺寸相匹配。下面的示例输出:
ArticleNr Location Packaging StockAtLocation NewPackaging Ranking
0012953 A15074E03 MB 235 33 10
0012953 A15074E03 MB 235 E2 11
0012953 A15074E03 MB 235 E3 12
0012953 A15074E03 MB 235 KK 13
0012953 A15074E03 MB 235 C4 14
0066487 A20057A03 KK 12 KK 13
0066487 A20057A03 KK 12 C4 14
示例:产品 0012953 当前包装在 'MB' 中,但在新仓库中它可以放入 33、E2、E3、KK 和 C4。如果它可以放在多个位置,它应该进入排名最低的位置。在这种情况下,它应该进入排名 10 的 NewPackaging“33”。
产品 0066487 应该去 KK,排名 13。
如何将查询调整为仅 returns 每个 ArticleNr 排名最低的记录?
期望的输出:
ArticleNr Location Packaging StockAtLocation NewPackaging Ranking
0012953 A15074E03 MB 235 33 10
0066487 A20057A03 KK 12 KK 13
查询:
SELECT
t1.ArticleNr,
t1.Location AS Location,
t1.StorageMedium AS Packaging,
t1.StockAtLocation,
t2.Verpakking AS NewPackaging,
t2.Ranking
FROM #Info t1,
#Dimensions t2
WHERE t1.Length < t2.Lengte
AND t1.Width < t2.Breedte
AND t1.Height < t2.Hoogte
AND t1.Volume < t2.MaxVol
AND (t1.PartWeightGross / 1000) < t2.MaxWeightArt
AND (t1.Volume * t1.StockAtLocation) < t2.MaxVol
AND ((t1.PartWeightGross / 1000) * t1.StockAtLocation) < t2.MaxWeightEmb
Order by ArticleNr asc, Ranking asc
在 Select 和 select 中添加一个 ROW_NUMBER,其中 Row_number = 1。
;with cte
as
(
SELECT
RN = ROW_NUMBER() OVER(PARTITION BY t1.ArticleNr ORDER BY ArticleNr asc, Ranking asc),
t1.ArticleNr,
t1.Location AS Location,
t1.StorageMedium AS Packaging,
t1.StockAtLocation,
t2.Verpakking AS NewPackaging,
t2.Ranking
FROM #Info t1,
#Dimensions t2
WHERE t1.Length < t2.Lengte
AND t1.Width < t2.Breedte
AND t1.Height < t2.Hoogte
AND t1.Volume < t2.MaxVol
AND (t1.PartWeightGross / 1000) < t2.MaxWeightArt
AND (t1.Volume * t1.StockAtLocation) < t2.MaxVol
AND ((t1.PartWeightGross / 1000) * t1.StockAtLocation) < t2.MaxWeightEmb
)
select
*
from cte
where rn = 1