在MySQL中,将每行中的值设置为相同行上的DATEDIFF计算

Dav*_*ero 5 mysql sql database

弄清楚这个问题的标题是非常棘手的,所以如果有人有任何改进的想法,请随时编辑:-).

这是交易.我有一个MySQL表,其中包括一堆捐款,每个捐款都有一个日期.我也有一个years_active专栏.我需要运行一个查询,该查询将SET每行激活的年份从每个唯一用户的第一个日期到最后一个日期的差异(以年为单位).

所以这是我的起点:

------------------------------------------------------------
|  user_id    |   donation    |    date     | years_active |
------------------------------------------------------------
|     1       |     $10       | 2002-01-01  |     null     |
|     1       |     $15       | 2005-01-01  |     null     |
|     1       |     $20       | 2009-01-01  |     null     |
|     2       |     $10       | 2003-01-01  |     null     |
|     2       |     $5        | 2006-01-01  |     null     |
|     3       |     $15       | 2001-01-01  |     null     |
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的表格:

------------------------------------------------------------
|  user_id    |   donation    |    date     | years_active |
------------------------------------------------------------
|     1       |     $10       | 2002-01-01  |     8        |
|     1       |     $15       | 2005-01-01  |     8        |
|     1       |     $20       | 2009-01-01  |     8        |
|     2       |     $10       | 2003-01-01  |     4        |
|     2       |     $5        | 2006-01-01  |     4        |
|     3       |     $15       | 2001-01-01  |     1        |
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我知道将years_active冗余存储在这样的多行中并不理想.不幸的是,这个表用于数据可视化,而且我的软件完全无法重新构建数据; 在years_active必须每排.

在我的研究好像我会使用子查询来获取MIN每个用户ID和值MAX对每个唯一的用户id的值,然后做了DATEDIFF这些,结果设定为列.但我真的不明白如何为每个独特的用户反复运行所有这些查询.

有人能指出我正确的方向吗?这可能吗?

Tim*_*sen 8

SELECT t1.user_id, t1.donation, t1.date, t2.years_active
FROM yourTable t1
INNER JOIN
(
    SELECT user_id, MAX(YEAR(date)) - MIN(YEAR(date)) + 1 AS years_active
    FROM yourTable
    GROUP BY user_id
) t2
    ON t1.user_id = t2.user_id
Run Code Online (Sandbox Code Playgroud)

请点击以下链接查看正在运行的演示:

SQLFiddle

更新:

这是一个UPDATE语句,它将为years_active列分配正确的值:

UPDATE yourTable t1 
INNER JOIN
(
    SELECT user_id, MAX(YEAR(date)) - MIN(YEAR(date)) + 1 AS years_active
    FROM yourTable
    GROUP BY user_id
) t2
    ON t1.user_id = t2.user_id
SET t1.years_active = t2.years_active
Run Code Online (Sandbox Code Playgroud)