【问题标题】:MySQL: Matching columns for year over yearMySQL:逐年匹配列
【发布时间】:2018-09-25 16:46:32
【问题描述】:

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

这是我的桌子

+------------+--------------+--------------+------+-------+
| 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 |
+------------+--------------+--------------+------+-------+

我的专栏是:

日期unique_id(这是 id 和 date 的连接;主键), prev_year_id(id 和日期的连接 - 间隔 1 年), id价值

我需要帮助创建一个语句来匹配 prev_year_id 和 unique_id 并返回行的值。

第一年会有差距,因为没有任何数据可以参考,但在第一年之后,每个 prev_year_value 都会匹配上一年的 unique_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

返回结果很慢,它返回的是下一年的值,而不是上一年。

【问题讨论】:

  • 请在您的问题中直接包含所有数据,不要发布链接。
  • 完成了,我是第一次在 Stack Overflow 上发帖,所以如果有什么我可以提供的,请告诉我。

标签: mysql join


【解决方案1】:
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 最终将为空,如您所愿。

在您尝试过的内部联接中,它只会包含结果,两个表中都有匹配项

【讨论】:

  • 谢谢,我搞定了。我从左连接开始,然后遇到了一些其他问题,因为我试图做一个子查询,而不必创建不必要的视图/表。现在我已经简化了一些事情,查询正在运行。
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多