【问题标题】:SQL Server Return just 1 row from total matchesSQL Server 从总匹配中仅返回 1 行
【发布时间】:2018-06-15 04:14:17
【问题描述】:

我进行了一个查询,将我们仓库中产品的产品尺寸与我们新库存位置的尺寸相匹配。下面的示例输出:


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。

如何调整查询以使其仅返回每个 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

【问题讨论】:

    标签: sql sql-server min having


    【解决方案1】:

    将 ROW_NUMBER 添加到 Select 并选择 where 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
    

    【讨论】:

    • 谢谢,效果很好,我相信我以后一定要再次使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2010-12-19
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多