所以猜测一些数据来匹配 SQL
WITH cunits AS (
SELECT * from values (1) v(id)
), unc AS (
SELECT * FROM VALUES (1,'123') v(CHILDUNITID,SYSSN)
), shpm AS (
SELECT * FROM VALUES ('a', '123', 10, '2020-02-01'),
('a', '123', 20, '2020-01-01')
v(ITEMCODE, SERIALNUMBER, QUANTITY, DELIVERYDATE)
), tsern AS (
SELECT * FROM VALUES (1,'zxc') v(UNITID,SERIALNUMBER)
), machined as (
SELECT * FROM VALUES ('zxc', 'XC0402A105KP5CNN-S') v(SERIALNUMBER, MPN)
)
并从示例中删除一些无关紧要的列
SELECT
MD.MPN,
SHIP.ITEMCODE AS SYSTEMPARTNUMBER,
SHIP.SERIALNUMBER AS SYSTEMSERIALNUMBER,
SUM(IFNULL(SHIP.QUANTITY,0)) AS QUANTITY,
SHIP.DELIVERYDATE
FROM cunits UNITS
JOIN unc UC ON UC.CHILDUNITID = UNITS.ID
JOIN shpm SHIP ON SHIP.SERIALNUMBER = UC.SYSSN
JOIN tsern SN ON SN.UNITID = UNITS.ID
JOIN machined MD ON MD.SERIALNUMBER = SN.SERIALNUMBER
WHERE
MPN = 'XC0402A105KP5CNN-S'
GROUP BY MD.MPN,SHIP.ITEMCODE,SHIP.SERIALNUMBER;
现在必须将 SHIP.DELIVERYDATE 添加到 group by 子句中,否则此代码将永远不会运行,甚至会忽略您不想看到 2020-01-01 数据的愿望
添加后,您会得到两行不想要的行。
MPN SYSTEMPARTNUMBER SYSTEMSERIALNUMBER QUANTITY DELIVERYDATE
XC0402A105KP5CNN-S a 123 10 2020-02-01
XC0402A105KP5CNN-S a 123 20 2020-01-01
Gordon 的解决方案,添加一个 QUALIFY
QUALIFY ROW_NUMBER() OVER (PARTITION BY MD.MPN, SHIP.SERIALNUMBER ORDER BY SHIP.DELIVERYDATE DESC) = 1;
正确地给出了答案,但是计算所有结果并修剪那些不需要的结果。根据您的数据集大小和shpm 表中有多少行,预过滤的 CTE 可能会更好..
WITH cunits AS (
SELECT * from values (1) v(id)
), unc AS (
SELECT * FROM VALUES (1,'123') v(CHILDUNITID,SYSSN)
), shpm AS (
SELECT * FROM VALUES ('a', '123', 10, '2020-02-01'),
('a', '123', 20, '2020-01-01')
v(ITEMCODE, SERIALNUMBER, QUANTITY, DELIVERYDATE)
), tsern AS (
SELECT * FROM VALUES (1,'zxc') v(UNITID,SERIALNUMBER)
), machined as (
SELECT * FROM VALUES ('zxc', 'XC0402A105KP5CNN-S') v(SERIALNUMBER, MPN)
), pre_filtered_shpm AS (
select * from shpm
QUALIFY ROW_NUMBER() OVER (PARTITION BY SERIALNUMBER ORDER BY DELIVERYDATE DESC) = 1
)
SELECT
MD.MPN,
SHIP.ITEMCODE AS SYSTEMPARTNUMBER,
SHIP.SERIALNUMBER AS SYSTEMSERIALNUMBER,
SUM(IFNULL(SHIP.QUANTITY,0)) AS QUANTITY,
SHIP.DELIVERYDATE
FROM cunits UNITS
JOIN unc UC ON UC.CHILDUNITID = UNITS.ID
JOIN pre_filtered_shpm SHIP ON SHIP.SERIALNUMBER = UC.SYSSN
JOIN tsern SN ON SN.UNITID = UNITS.ID
JOIN machined MD ON MD.SERIALNUMBER = SN.SERIALNUMBER
WHERE
MPN = 'XC0402A105KP5CNN-S'
GROUP BY MD.MPN,SHIP.ITEMCODE,SHIP.SERIALNUMBER,SHIP.DELIVERYDATE;