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

标签 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     |
------------------------------------------------------------

这是我想要实现的表格:

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

相关文章:

php - 如何使用 ajax 和 php 将 mysql 表移动到下一行和上一行?

mysql - mysql 处理随机字母索引比数字花费大量时间吗?

php - 日期未插入 mysql_query 插入

C# 应用程序创建许多连接线程,MySQL

sql - Hadoop配置单元查询

php - 如何限制 HTML 中的列数

sql - 如何在bigquery查询上设置命名参数

java - 更改 Java 项目的数据库类型?

python - 使用 mysql 或 python 代码将一组文本文件导入到 mysql

即使在正确的 'yum remove' 和 'yum install' 之后,MySQL 仍保留早期安装的密码