我有以下两个表:
1)表名:期间
+----------+
| 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的Amount。例如,对于PeriodID 2,它返回StartPeriod 1的金额,因为StartPeriod2没有值,1是小于或等于2的最大数字,在值表中有金额。
(抱歉这些表很难看)
谢谢!
答案 0 :(得分:2)
您可以使用相关的子查询来执行此操作:
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