mysql - 滚动更改的 SQL 查询

标签 mysql

我有以下两个表:

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

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

关于mysql - 滚动更改的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979828/

相关文章:

php - 要求需要数据库连接的文件的正确方法

mysql - 带有附加表的三向内连接

mysql - SailsJS 1.0 : Error in . create() Mongo 中的模型与存储在 MySQL 中的模型的单向关联

java - Spring 4.3.0.RELEASE + Hibernate 5.2.0.Final - 每次插入重复行

php - 如何确定具有多个类别的产品的面包屑?

php - 从两个 Mysql 表中获取信息

mysql - 在 mySQL 数据库上创建搜索

php - 使用 Point 类型的 PHPUnit/CakePHP Fixtures

Python,如何读取平面文件并通过识别文件中每列的分隔符将信息填充到相关列中

mysql - 列出每个对话的最后 (N) 条消息