MySQL:对于每个id,使用顺序日期计算其间的space
MySQL: For each id, using sequential dates to calculate space in between
我正在努力寻找我需要解决的问题的解决方案,所以我决定提出问题,而不是仅仅查看其他不是我正在寻找的问题。
我正在使用 mysql 并且有如下数据:
| id | date |
| 1 | 2015-06-05|
| 1 | 2015-06-07|
| 1 | 2015-06-08|
| 2 | 2015-06-04|
| 2 | 2015-06-06|
| 3 | 2015-06-03|
| 3 | 2015-06-08|
| 4 | 2015-06-02|
id 代表数据库中的特定用户,date 代表该用户发生事件的日期。 我的目标是计算一个用户发生的一个事件与同一用户的下一个事件之间的平均时间量,对所有用户取平均值。
因此,例如,使用我提供的示例数据,对于 id 1 用户,我想从该用户的第一个事件开始,并找出该事件与下一个事件之间的时间间隔:2015-06 -07 - 2015-06-05 = 2 天。接下来是第二个和第三个事件之间的时间间隔:2015-06-08 - 2015-06-07 = 1 天。当我们沿着列表往下看时,我们将天数加在一起并跟踪我们计算了多少时间空间,以便我们可以在最后取平均值。在用户 1 之后,我们总共有 3 天,并添加了 2 个空间。
对于 id 2 用户,我们有 2 天(2015-06-06 - 2015-06-04 = 2),所以总共 5 天,添加了 3 个空格。在 id 3 用户之后,我们总共有 10 天,有 4 个空格 (2015-06-08 - 2015-06-03 = 5)。对于 id 4 用户,只有一个事件,所以我们没有添加任何空格,所以我们保持 10 天总共有 4 个空格(只有一个事件的 ID 基本上被忽略)。所以我们的答案是 10/4 = 2.5 作为这一小组数据的平均值。
我需要能够使用 运行 代码之前的数据计算此结果,我不知道不同 ID 的数量或每个 ID 的事件数量或范围活动日期。
我发现对于实际的日期减法部分,函数 TIMESTAMPDIFF(DAY, date1, date2) 以 DAY 为单位工作。这是在多个 id 上实际使用此函数的部分,每个 id 在我遇到问题的数据中都有一系列事件。
如何在 MySQL 中计算出想要的结果?日期将始终以正确的顺序排列。该示例按从最早到最新的顺序显示它们,但如果需要,我可以将它们从最新到最早重新排列。此外,如果需要,我可以使用代码来删除只有一个事件的 ID。感谢您提供任何见解。
当然,在提出问题后不到一个小时,我就想出了自己的解决方案,尽管我已经为此工作了几个小时。
我意识到对于单个用户,该用户的每个事件之间的 space 总和就是第一个事件和最后一个事件之间的 space(对于id 1 用户,我们有 2 + 1 = 3 的总数,但我们可以找到第一个和最后一个日期之间的差异,这也是 3)。
这意味着只需要第一个和最后一个日期就可以找到想要的结果,这让一切变得更加容易。为了模拟将单个用户事件之间的所有 spaces 相加,我们除以 spaces 的数量,即该用户的行数减 1。GROUP BY 子句与MIN 和 MAX 以及 COUNT 函数允许我们获取第一个和最后一个日期以及 spaces.
的计数
下面的代码应该是所需要的(其中数据是 table,就像给定的示例)。
SELECT SUM(diff)/COUNT(diff)
FROM (
SELECT id, TIMESTAMPDIFF(DAY, min, max)/count AS diff
FROM (
SELECT id, MIN(date) AS min, MAX(date) AS max, COUNT(id)-1 AS count
FROM data
GROUP BY id
)
)
我正在努力寻找我需要解决的问题的解决方案,所以我决定提出问题,而不是仅仅查看其他不是我正在寻找的问题。
我正在使用 mysql 并且有如下数据:
| id | date |
| 1 | 2015-06-05|
| 1 | 2015-06-07|
| 1 | 2015-06-08|
| 2 | 2015-06-04|
| 2 | 2015-06-06|
| 3 | 2015-06-03|
| 3 | 2015-06-08|
| 4 | 2015-06-02|
id 代表数据库中的特定用户,date 代表该用户发生事件的日期。 我的目标是计算一个用户发生的一个事件与同一用户的下一个事件之间的平均时间量,对所有用户取平均值。
因此,例如,使用我提供的示例数据,对于 id 1 用户,我想从该用户的第一个事件开始,并找出该事件与下一个事件之间的时间间隔:2015-06 -07 - 2015-06-05 = 2 天。接下来是第二个和第三个事件之间的时间间隔:2015-06-08 - 2015-06-07 = 1 天。当我们沿着列表往下看时,我们将天数加在一起并跟踪我们计算了多少时间空间,以便我们可以在最后取平均值。在用户 1 之后,我们总共有 3 天,并添加了 2 个空间。
对于 id 2 用户,我们有 2 天(2015-06-06 - 2015-06-04 = 2),所以总共 5 天,添加了 3 个空格。在 id 3 用户之后,我们总共有 10 天,有 4 个空格 (2015-06-08 - 2015-06-03 = 5)。对于 id 4 用户,只有一个事件,所以我们没有添加任何空格,所以我们保持 10 天总共有 4 个空格(只有一个事件的 ID 基本上被忽略)。所以我们的答案是 10/4 = 2.5 作为这一小组数据的平均值。
我需要能够使用 运行 代码之前的数据计算此结果,我不知道不同 ID 的数量或每个 ID 的事件数量或范围活动日期。
我发现对于实际的日期减法部分,函数 TIMESTAMPDIFF(DAY, date1, date2) 以 DAY 为单位工作。这是在多个 id 上实际使用此函数的部分,每个 id 在我遇到问题的数据中都有一系列事件。
如何在 MySQL 中计算出想要的结果?日期将始终以正确的顺序排列。该示例按从最早到最新的顺序显示它们,但如果需要,我可以将它们从最新到最早重新排列。此外,如果需要,我可以使用代码来删除只有一个事件的 ID。感谢您提供任何见解。
当然,在提出问题后不到一个小时,我就想出了自己的解决方案,尽管我已经为此工作了几个小时。
我意识到对于单个用户,该用户的每个事件之间的 space 总和就是第一个事件和最后一个事件之间的 space(对于id 1 用户,我们有 2 + 1 = 3 的总数,但我们可以找到第一个和最后一个日期之间的差异,这也是 3)。
这意味着只需要第一个和最后一个日期就可以找到想要的结果,这让一切变得更加容易。为了模拟将单个用户事件之间的所有 spaces 相加,我们除以 spaces 的数量,即该用户的行数减 1。GROUP BY 子句与MIN 和 MAX 以及 COUNT 函数允许我们获取第一个和最后一个日期以及 spaces.
的计数下面的代码应该是所需要的(其中数据是 table,就像给定的示例)。
SELECT SUM(diff)/COUNT(diff)
FROM (
SELECT id, TIMESTAMPDIFF(DAY, min, max)/count AS diff
FROM (
SELECT id, MIN(date) AS min, MAX(date) AS max, COUNT(id)-1 AS count
FROM data
GROUP BY id
)
)