弄清楚这个问题的标题是非常棘手的,所以如果有人有任何改进的想法,请随时编辑:-)。
这是交易。我有一个包含大量捐款的 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 |
------------------------------------------------------------
这是我想要实现的表格:
------------------------------------------------------------
| 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 |
------------------------------------------------------------
我知道像这样在多行中冗余存储 years_active
远非理想。不幸的是,这张表是用于数据可视化的,而使用我的软件,我绝对无法完全重组数据; years_active
必须在每一行中。
在我的研究中,我似乎会使用子查询来获取每个用户 ID 的 MIN
值和每个唯一用户 ID 的 MAX
值,然后执行DATEDIFF
,并将结果设置到该列。但我真的不明白如何为每个唯一用户一遍又一遍地运行所有这些查询。
有人能指出我正确的方向吗?这可能吗?
最佳答案
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
点击下面的链接获取正在运行的演示:
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
关于mysql - 在 MySQL 中,将每一行中的值设置为同一行上的 DATEDIFF 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385150/