0

我有一个带有两个链接表产品和价格历史的 MySQL 数据库。它们由 productID 字段链接。每次产品价格发生变化时,我都会创建一个新的历史记录。产品的最新历史记录具有最新价格。我还将当前价格存储在产品表中。我想运行一个可以检索第二个最后价格历史记录的报告,以便比较当前价格和最后价格。我尝试了下面的 sql 查询,它返回最新的价格历史记录,即当前价格。如何获得第二个最近的价格历史记录?对于较新的记录,historyID 会更高,因为它是 Auto Increment 并且价格历史记录 updateTime 对于较新的记录也将是更新的,因此这可能是一种排序方式。谢谢!

SELECT 
  product.code, product.currentPrice, priceHistory.price, 
  product.url, product.manuID, product.lastSeenTime,
  priceHistory.updateTime, product.dateAdded, 
  priceHistory.historyID 
FROM product, priceHistory 
WHERE product.idProduct = priceHistory.productID 
GROUP BY priceHistory.productID 
HAVING count(*) > 1 
ORDER BY `product`.`lastSeenTime` DESC
4

1 回答 1

1

您可以使用ROW_NUMBER()窗口函数根据任何动态排序为行分配编号。完成此操作后,您只需按该数字进行过滤即可。

例如:

with
h as (
  select *,
    row_number() over(partition by productid order by updatetime desc) as rn
  from pricehistory
)
select
  p.code,
  p.currentprice,
  h.price,
  p.url,
  p.manuid,
  p.lastseentime,
  h.updatetime,
  p.dateadded,
  h.historyid
from product p
left join h on h.productid = p.productid and h.rn = 2

编辑

如果不能使用 CTE,则可以使用表表达式重写查询,如下所示:

select
  p.code,
  p.currentprice,
  h.price,
  p.url,
  p.manuid,
  p.lastseentime,
  h.updatetime,
  p.dateadded,
  h.historyid
from product p
left join (
  select *,
    row_number() over(partition by productid order by updatetime desc) as rn
  from pricehistory
) h on h.productid = p.productid and h.rn = 2
于 2019-08-10T22:35:06.537 回答