Select MAX 和 RIGHT OUTER JOIN

Select MAX and RIGHT OUTER JOIN

我有平台可以从 sql 表中提取数据,到目前为止,所有查询都是通过简单的拖放工具生成的。现在我正在尝试手动更改查询,但它没有按预期工作...

你能看看吗?

生成器传递的查询:

SELECT
  repo.MAT.MAT_A_COD,
  inventory.INV.MRP_RQMT_DT,
  SUM(inventory.INV.MRP_AVL_QTY)
  
FROM
  repo.MAT RIGHT OUTER JOIN inventory.INV ON (inventory.INV.MRP_MAT_A_FK=repo.MAT.MAT_A_PK)
  
WHERE
  ( inventory.INV.MRP_COMPANY_COD IN ('01','02')  )
  
GROUP BY
  1, 
  2

结果:

Material A | 2020.01.01 | 100
Material A | 2020.01.02 | 200
Material A | 2020.01.03 | 300
Material B | 2020.01.01 | 10
Material B | 2020.01.02 | 0

我要查找的内容:只有每个 material.

的最新日期值
Material A | 2020.01.03 | 300
Material B | 2020.01.02 | 0

我尝试使用 MAX(inventory.INV.MRP_RQMT_DT),但没有成功。感谢您的帮助!

你可以试试下面的-

SELECT
  repo.MAT.MAT_A_COD,
  inventory.INV.MRP_RQMT_DT,
  SUM(inventory.INV.MRP_AVL_QTY)
FROM
  repo.MAT RIGHT OUTER JOIN inventory.INV ON inventory.INV.MRP_MAT_A_FK=repo.MAT.MAT_A_PK
WHERE
  inventory.INV.MRP_COMPANY_COD IN ('01','02') and inventory.INV.MRP_RQMT_DT=(select max(inventory.INV.MRP_RQMT_DT) from inventory.INV inv1 where inventory.INV.MRP_MAT_A_FK=inv1.MRP_MAT_A_FK)
GROUP BY 1, 2

您没有指定数据库引擎,但 RANK windows 函数在许多主要引擎中都有效(我将使用 T-SQL 语法)。

SELECT * FROM (
    SELECT
       repo.MAT.MAT_A_COD,
       inventory.INV.MRP_RQMT_DT,
       SUM(inventory.INV.MRP_AVL_QTY),
       RANK () OVER (PARTITION BY repo.MAT.MAT_A_COD ORDER BY inventory.INV.MRP_RQMT_DT) rn
  
    FROM repo.MAT RIGHT OUTER JOIN inventory.INV ON (inventory.INV.MRP_MAT_A_FK=repo.MAT.MAT_A_PK)
  
    WHERE inventory.INV.MRP_COMPANY_COD IN ('01','02')
  
    GROUP BY 1, 2
)
WHERE rn = 1

您可以使用 window 函数:

SELECT m.MAT_A_COD,  i.MRP_RQMT_DT,
       SUM(i.MRP_AVL_QTY) 
FROM repo.MAT LEFT JOIN
     (SELECT i.*, 
             MAX(MRP_RQMT_DT) OVER (PARTITION BY MRP_MAT_A_FK ORDER BY DESC) as max_MRP_RQMT_DT
      FROM inventory.INV i
     ) i
     ON i.MRP_MAT_A_FK = r.MAT_A_PK AND
        i.MRP_RQMT_DT = i.max_MRP_RQMT_DT  
WHERE i.MRP_COMPANY_COD IN ('01', '02')  
GROUP BY 1, 2;

注意查询的其他更改:

  • Table 别名使查询更易于编写和阅读。
  • 外连接似乎根本没有必要。但如果你确实使用了一个,它可能在 MAT table,而不是 inventory table.
  • 如果您使用外部联接,您应该尝试从保留所有行的 table 中获取列 - LEFT JOIN 中的第一个 table。我一般不推荐RIGHT JOINs。