用于滚动更改的SQL查询

时间:2015-10-06 21:11:11

标签: mysql

我有以下两个表:

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的最大数字,在值表中有金额。

(抱歉这些表很难看)

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用相关的子查询来执行此操作:

SELECT PeriodID, 
       (SELECT Amount
       FROM Value
       WHERE StartPeriod <= PeriodID
       ORDER BY StartPeriod DESC LIMIT 1) AS Amount
FROM Period AS p

Demo here

与相关子查询相比,使用变量可能表现更好:

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

Demo here