【问题标题】:Get last fixed price per product from table从表中获取每个产品的最后固定价格
【发布时间】:2021-10-07 08:58:10
【问题描述】:

这似乎是一个简单的 SQL 问题,但我无法在 MySQL 中完成。

我有一张表格,其中包含从特定日期开始有效且与数量相关的不同产品 (ProdID) 的价格。对于当前的价目表,我需要获取自表中最新的 valid_from 日期以来有效的价格。不能使用时间戳,因为有时插入的价格是针对未来的 valid_from 日期,与 ID 相同,不代表实际价格。

ID, ProdID, qty, price, valid_from, timestamp
100 51  25      3.360   2021-02-15  2021-05-11 19:20:28
101 51  2000    3.150   2021-02-15  2021-05-11 19:20:29
102 51  6000    2.930   2021-02-15  2021-05-11 19:20:30
103 51  15000   2.870   2021-02-15  2021-05-11 19:20:31
131 51  1000    3.250   2021-02-15  2021-05-11 19:20:59
....
140 51  25      3.970   2021-10-06  2021-10-06 16:51:48
141 51  1000    3.790   2021-10-06  2021-10-06 16:51:50
142 51  2000    3.650   2021-10-06  2021-10-06 17:45:49
143 51  6000    3.500   2021-10-06  2021-10-06 16:51:54
144 51  15000   3.400   2021-10-06  2021-10-06 16:51:56
                

例如,这些是 ProdID 51 的行。

我需要获取当前有效的价格。在这种情况下,ID 为 141 到 144,但这只是巧合。价格也可能会降低,所以我不能为每个 prodID 争取最高价格。唯一的标准是最新的 valid_from 日期,即 date())。

我试过这个,但它带来了以上所有行,从 2021 年 5 月 11 日起有效,从 2021 年 10 月 6 日起有效:

SELECT `p`.`qty` AS `quantity`,
       `p`.`price` AS `price`,
       `p`.`ProdID` AS `ProdID`,
       row_number() OVER (PARTITION BY `p`.`ProdID`
                          ORDER BY `p`.`valid_from` DESC,`p`.`qty`) AS `rk`
FROM `tblprices` `p`

【问题讨论】:

  • 抱歉,这是 SQL 服务器吗?因为那个 row_number() ?
  • 为什么2021-10-06有6个价格?在这种情况下,预期的结果是什么? 1 行还是 6 行?
  • 不,它是 MySQL 服务器 8.0。但是又找了半个小时,我找到了一个没有它的解决方案,它可以工作。 select * from tblprices a, (select ProdID, max(valid_from) as valid_from from tblprices where valid_from
  • @Salman:因为它是一个取决于数量的价格尺度。所以 6 行是正确的

标签: mysql sql


【解决方案1】:

您可以使用窗口函数。使用RANK 查找每组最大的行:

WITH cte AS (
  SELECT *, RANK() OVER (PARTITION BY ProdID ORDER BY valid_from DESC) AS rnk
  FROM t
  WHERE valid_from <= CURRENT_DATE
)
SELECT *
FROM cte
WHERE rnk = 1

【讨论】:

  • 非常感谢,我忘了用 cte 试试!有用!!我一直认为它适用于 MS-SQL。
猜你喜欢
  • 2015-11-05
  • 1970-01-01
  • 2020-03-05
  • 2021-01-08
  • 1970-01-01
  • 2021-12-04
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多