mysql:逐年匹配列

mlmc2os5  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(285)

这是一个帮助澄清我的问题转载。我正在处理时间序列数据,我需要引用上一年的数据。在excel中,我只使用vlookup或索引匹配。
这是我的table

+------------+--------------+--------------+------+-------+
| date       | unique_id    | prev_year_id | id   | value |
+------------+--------------+--------------+------+-------+
| 2016-01-01 | 1-2016-01-01 | 1-2015-01-01 |    1 |     7 |
| 2016-01-01 | 2-2016-01-01 | 2-2015-01-01 |    2 |    19 |
| 2016-01-01 | 3-2016-01-01 | 3-2015-01-01 |    3 |     6 |
| 2016-01-01 | 4-2016-01-01 | 4-2015-01-01 |    4 |    13 |
| 2016-01-01 | 5-2016-01-01 | 5-2015-01-01 |    5 |     5 |
| 2017-01-01 | 1-2017-01-01 | 1-2016-01-01 |    1 |    17 |
| 2017-01-01 | 2-2017-01-01 | 2-2016-01-01 |    2 |     8 |
| 2017-01-01 | 3-2017-01-01 | 3-2016-01-01 |    3 |    20 |
| 2017-01-01 | 4-2017-01-01 | 4-2016-01-01 |    4 |     3 |
| 2017-01-01 | 5-2017-01-01 | 5-2016-01-01 |    5 |     0 |
| 2018-01-01 | 1-2018-01-01 | 1-2017-01-01 |    1 |     4 |
| 2018-01-01 | 2-2018-01-01 | 2-2017-01-01 |    2 |    21 |
| 2018-01-01 | 3-2018-01-01 | 3-2017-01-01 |    3 |     7 |
| 2018-01-01 | 4-2018-01-01 | 4-2017-01-01 |    4 |     3 |
| 2018-01-01 | 5-2018-01-01 | 5-2017-01-01 |    5 |     6 |
+------------+--------------+--------------+------+-------+

我的列是:
日期,唯一的\ id(这是id和日期的结合;主键),上一年的id(id和日期的连接-间隔1年),id,值
我需要帮助生成一个语句,将上一年的id与唯一的id进行匹配,并返回行的值。
由于没有任何数据可供参考,因此第一年会有一个间隔,但在第一年之后,每个上一年的值将与其上一年的唯一id相匹配
这就是我想象的最终结果:

+------------+--------------+--------------+------+-------+-----------------+
| date       | unique_id    | prev_year_id | id   | value | prev_year_value |
+------------+--------------+--------------+------+-------+-----------------+
| 2016-01-01 | 1-2016-01-01 | 1-2015-01-01 |    1 |     7 | null            |
| 2016-01-01 | 2-2016-01-01 | 2-2015-01-01 |    2 |    19 | null            |
| 2016-01-01 | 3-2016-01-01 | 3-2015-01-01 |    3 |     6 | null            |
| 2016-01-01 | 4-2016-01-01 | 4-2015-01-01 |    4 |    13 | null            |
| 2016-01-01 | 5-2016-01-01 | 5-2015-01-01 |    5 |     5 | null            |
| 2016-01-01 | 1-2017-01-01 | 1-2016-01-01 |    1 |    17 | 7               |
| 2016-01-01 | 2-2017-01-01 | 2-2016-01-01 |    2 |     8 | 19              |
| 2016-01-01 | 3-2017-01-01 | 3-2016-01-01 |    3 |    20 | 6               |
| 2016-01-01 | 4-2017-01-01 | 4-2016-01-01 |    4 |     3 | 13              |
| 2016-01-01 | 5-2017-01-01 | 5-2016-01-01 |    5 |     0 | 5               |
| 2016-01-01 | 1-2018-01-01 | 1-2017-01-01 |    1 |     4 | 17              |
| 2016-01-01 | 2-2018-01-01 | 2-2017-01-01 |    2 |    21 | 8               |
| 2016-01-01 | 3-2018-01-01 | 3-2017-01-01 |    3 |     7 | 20              |
| 2016-01-01 | 4-2018-01-01 | 4-2017-01-01 |    4 |     3 | 3               |
| 2016-01-01 | 5-2018-01-01 | 5-2017-01-01 |    5 |     6 | 0               |
+------------+--------------+--------------+------+-------+-----------------+

这是我的声明。。

SELECT A.*, B.value as 'prev_year_value'
FROM table1 A
INNER JOIN table1 B ON A.current_month_code = B.`prev_year_code

结果是非常缓慢的回报,它返回明年的价值,而不是前一年。

qhhrdooz

qhhrdooz1#

SELECT a.*, b.`value` as `prev_year_value`
FROM `table1` a
LEFT JOIN `table1` b
ON a.`prev_year_id` = b.`unique_id`

因为这是一个左连接,所以如果“on”语句没有结果,结果仍将包括 a ,和 prev_year_value 最终将为空,如您所愿。
在像您尝试的那样的内部联接中,它将只包含结果,其中两个表中都有匹配

相关问题