我有以下两个表:
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的金额.例如,对于PeriodID 2,它将返回StartPeriod 1的金额,因为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
来源: https://codeday.me/bug/20191119/2037594.html
本文介绍了一个具体的MySQL查询案例,旨在获取每个时间段对应的金额。通过左连接和变量的方式解决了只有当金额发生变化时才会记录的问题。
1716

被折叠的 条评论
为什么被折叠?



