关联charging与taxes表查询重复字段及双最大值的SQL需求
解决思路与SQL示例
没问题呀,刚接触数据库有疑问太正常了~我来帮你梳理这个查询需求,一步步实现你要的结果:
首先,你的核心需求可以拆成两部分:
- 找出
charging表中**invoiceNumber和sequentialInvoice组合重复**的所有记录(也就是这两个字段值同时出现多次的场景) - 同时获取这两个字段的最大值(这里分两种常见场景,我都给你写出来)
情况1:获取每个重复组合内的最大值(组内字段值一致,最大值即本身)
这个场景下,我们先找出重复的字段组合,再关联回原表和taxes表,同时标记每组的最大值:
-- 用子查询筛选重复的字段组合,再关联获取所有关联数据 SELECT c.invoiceNumber, c.sequentialInvoice, t.sequentialObligation, t.sequentialTax, t.reference, -- 每个重复组内的invoiceNumber最大值(和组内值一致) MAX(c.invoiceNumber) OVER (PARTITION BY c.invoiceNumber, c.sequentialInvoice) AS group_max_invoice, -- 每个重复组内的sequentialInvoice最大值(和组内值一致) MAX(c.sequentialInvoice) OVER (PARTITION BY c.invoiceNumber, c.sequentialInvoice) AS group_max_sequential FROM charging c -- 通过invoiceNumber关联taxes表 JOIN taxes t ON c.invoiceNumber = t.reference -- 只保留属于重复组合的记录 WHERE (c.invoiceNumber, c.sequentialInvoice) IN ( SELECT invoiceNumber, sequentialInvoice FROM charging GROUP BY invoiceNumber, sequentialInvoice -- 筛选出现次数>1的重复组合 HAVING COUNT(*) > 1 );
情况2:获取所有重复组合中的全局最大值
如果你需要的是所有重复场景里,invoiceNumber的最大值和sequentialInvoice的最大值,可以用CTE先缓存重复组合,再计算全局最大值:
WITH duplicate_pairs AS ( -- 先找出所有重复的字段组合 SELECT invoiceNumber, sequentialInvoice FROM charging GROUP BY invoiceNumber, sequentialInvoice HAVING COUNT(*) > 1 ) SELECT c.invoiceNumber, c.sequentialInvoice, t.sequentialObligation, t.sequentialTax, t.reference, -- 所有重复组合中的invoiceNumber最大值 (SELECT MAX(invoiceNumber) FROM duplicate_pairs) AS global_max_invoice, -- 所有重复组合中的sequentialInvoice最大值 (SELECT MAX(sequentialInvoice) FROM duplicate_pairs) AS global_max_sequential FROM charging c JOIN taxes t ON c.invoiceNumber = t.reference WHERE (c.invoiceNumber, c.sequentialInvoice) IN (SELECT * FROM duplicate_pairs);
补充说明
如果你的“最大值”是指其他字段(比如charging表中的金额、日期等),只需要把MAX()里的字段替换成你需要的字段即可。
内容的提问来源于stack exchange,提问作者Powdertrail
相关产品推荐
相关产品推荐

