【发布时间】: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 行是正确的