You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用交叉表查询(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:39:52