如何编写SQL查询仅汇总关联子表最新10条记录的求和值
解决方案
要实现仅对每个tablea关联的tableb中最新10条记录(按date降序)的value求和,可以通过窗口函数筛选目标记录后再聚合,修改后的查询如下:
SELECT a.name, SUM(b.value) AS V FROM tablea a INNER JOIN ( -- 给每个tableAID对应的记录按date降序编号 SELECT tableAID, value, ROW_NUMBER() OVER (PARTITION BY tableAID ORDER BY date DESC) AS rn FROM tableb ) b ON a.ID = b.tableAID -- 仅保留每组前10条最新记录 WHERE b.rn <= 10 GROUP BY a.name
关键逻辑说明
- 子查询中使用
ROW_NUMBER()窗口函数,按tableAID分组,每组内按date倒序为记录分配序号,最新的记录序号为1,依次递增。 - 通过
WHERE b.rn <= 10筛选出每个tablea对应的最新10条tableb记录,再与tablea关联后对value求和。
如果需要列出所有tablea记录(即使没有匹配的tableb数据),可以改用LEFT JOIN并调整条件位置,确保无关联数据时求和结果显示为0:
SELECT a.name, ISNULL(SUM(b.value), 0) AS V FROM tablea a LEFT JOIN ( SELECT tableAID, value, ROW_NUMBER() OVER (PARTITION BY tableAID ORDER BY date DESC) AS rn FROM tableb ) b ON a.ID = b.tableAID AND b.rn <= 10 GROUP BY a.name
内容的提问来源于stack exchange,提问作者Mark Homer
相关产品推荐
相关产品推荐

