我有以下两个表:
1)表名:period
+----------+
| PeriodID |
+----------+
| 1 |
| 2 |
| 3 |
| 4 |
+----------+
2)表名:值
+-------------+--------+
| StartPeriod | Amount |
+-------------+--------+
| 1 | 100 |
| 3 | 200 |
+-------------+--------+
第一个表格代表时间段,例如月份。第二个表代表每个月的金额,但仅当它与上个月不同时。金额从 100 开始,第 2 期保持在 100,然后从第 3 期开始跳升至 200,之后保持在 200。
我需要一个查询 (MySQL) 来返回每个期间的金额,如下所示:
+----------+--------+
| PeriodID | Amount |
+----------+--------+
| 1 | 100 |
| 2 | 100 |
| 3 | 200 |
| 4 | 200 |
+----------+--------+
因此查询将返回值表中小于或等于 PeriodID 的最新 StartPeriod 的金额。例如,对于 PeriodID 2,它返回 StartPeriod 1 的 Amount,因为 StartPeriod2 没有值,而 1 是小于或等于 2 且在值表中具有 Amount 的最大数。
(抱歉表格太丑了)
谢谢!
最佳答案
您可以使用相关子查询来做到这一点:
SELECT PeriodID,
(SELECT Amount
FROM Value
WHERE StartPeriod <= PeriodID
ORDER BY StartPeriod DESC LIMIT 1) AS Amount
FROM Period AS p
与相关子查询相比,使用变量可能执行得更好:
SELECT PeriodID,
@amount := IF(Amount IS NOT NULL, Amount, @amount) AS Amount
FROM (
SELECT PeriodID, Amount
FROM Period AS p
LEFT JOIN Value AS v ON p.PeriodID = v.StartPeriod) AS t
CROSS JOIN (SELECT @amount := -1) AS var
ORDER BY PeriodID
关于mysql - 滚动更改的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979828/