使用交叉表查询(Crosstab query)获取各产品组最新日期价格
获取各产品组最新日期价格的SQL查询
假设表结构
先明确三张表的核心字段(如果你的字段名不同,替换成实际名称即可):
Person:PersonID(主键)、PersonName(人员名称)ProductGroup:ProductGroupID(主键)、GroupName(产品组名称)Pricing:PricingID(主键)、PersonID(关联Person表)、ProductGroupID(关联ProductGroup表)、Price(价格)、PriceDate(价格日期)
方案1:使用窗口函数(推荐,支持MySQL 8.0+、PostgreSQL、SQL Server等)
通过ROW_NUMBER()窗口函数给每个产品组的价格记录按日期倒序编号,取编号为1的就是该组最新记录:
SELECT pg.GroupName, p.PersonName, pr.Price, pr.PriceDate FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductGroupID ORDER BY PriceDate DESC) AS rn FROM Pricing ) pr JOIN Person p ON pr.PersonID = p.PersonID JOIN ProductGroup pg ON pr.ProductGroupID = pg.ProductGroupID WHERE pr.rn = 1;
如果同一个产品组在同一天有多个价格记录(比如不同人员的报价),这个查询会保留所有当天的记录;若只想保留每个产品组最新日期的任意一条,用ROW_NUMBER()即可;若要保留同最新日期的全部记录,把ROW_NUMBER()换成RANK()就行。
方案2:关联子查询(兼容旧版MySQL等)
先找出每个产品组的最新日期,再关联Pricing表获取对应价格数据:
SELECT pg.GroupName, p.PersonName, pr.Price, pr.PriceDate FROM Pricing pr JOIN Person p ON pr.PersonID = p.PersonID JOIN ProductGroup pg ON pr.ProductGroupID = pg.ProductGroupID JOIN ( SELECT ProductGroupID, MAX(PriceDate) AS LatestDate FROM Pricing GROUP BY ProductGroupID ) latest ON pr.ProductGroupID = latest.ProductGroupID AND pr.PriceDate = latest.LatestDate;
这个方法会返回每个产品组最新日期下的所有价格记录(包含同一日期不同人员的报价)。
注意事项
- 替换查询中的字段名和表名为你的实际业务名称
- 若需筛选特定人员的价格,可在WHERE子句中添加
p.PersonID = 目标ID或p.PersonName = '目标名称'
内容的提问来源于stack exchange,提问作者mohammad kermany
相关产品推荐
相关产品推荐

