在SQLite数据库中查找符合条件的非唯一值并计算最新费用总和
解决SQLite中获取非唯一组合最新费用总和的问题
看起来你需要从billing表中,针对重复出现的Account+Product组合(也就是你说的“非唯一值”),提取每组的最新费用,最后计算这些费用的总和。我来一步步帮你实现这个需求:
步骤1:筛选非唯一组合并获取每组最新日期
首先我们要先定位那些出现过多次的Account+Product配对,同时拿到每组的最新日期:
SELECT Account, Product, MAX(Date) AS LatestDate FROM billing GROUP BY Account, Product HAVING COUNT(*) > 1 -- 只保留出现多次的非唯一组合
这里的HAVING COUNT(*) > 1就是筛选条件,确保我们只处理有重复记录的组合。
步骤2:关联原表获取对应最新费用
把上面的查询结果和原表关联,就能拿到每组最新日期对应的费用值:
SELECT b.Charge FROM billing b INNER JOIN ( SELECT Account, Product, MAX(Date) AS LatestDate FROM billing GROUP BY Account, Product HAVING COUNT(*) > 1 ) latest ON b.Account = latest.Account AND b.Product = latest.Product AND b.Date = latest.LatestDate
步骤3:计算最新费用的总和
最后用SUM()函数把这些费用加起来,得到最终结果:
SELECT SUM(b.Charge) AS TotalLatestCharges FROM billing b INNER JOIN ( SELECT Account, Product, MAX(Date) AS LatestDate FROM billing GROUP BY Account, Product HAVING COUNT(*) > 1 ) latest ON b.Account = latest.Account AND b.Product = latest.Product AND b.Date = latest.LatestDate
用你的示例数据测试
代入你给出的表数据:
- Account1+Water是唯一的非唯一组合,最新日期是04-02,对应费用20
- 其他组合(Account2+Phone、Account3+Water)都只出现一次,不会被计入
最终计算出的总和就是20,完全符合预期。
⚠️ 小提醒:你的Date字段是MM-DD格式,如果涉及跨年数据,建议改成YYYY-MM-DD的标准日期格式,这样MAX(Date)的排序逻辑才会更准确。如果只有月日,SQLite会按字符串排序,当前示例的情况是没问题的,但跨月场景要确保逻辑符合你的需求。
内容的提问来源于stack exchange,提问作者user7722705
相关产品推荐
相关产品推荐

