我正在努力寻找我需要解决的问题的解决方案,所以我决定提出问题,而不是仅仅查看其他不是我正在寻找的问题。
我正在使用 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。感谢您提供任何见解。
最佳答案
当然,在提出问题后不到一个小时,我就想出了自己的解决方案,尽管我已经为此工作了几个小时。
我意识到对于单个用户,该用户的每个事件之间的空间量之和就是第一个事件和最后一个事件之间的空间(对于 id 1 用户,我们有 2 + 1 =总数为 3,但我们本可以找到第一个日期和最后一个日期之间的差异,这也是 3)。
这意味着只需要第一个和最后一个日期就可以找到所需的结果,这使得一切变得更加容易。为了模拟将单个用户事件之间的所有空格加在一起,我们除以空格数,即该用户的行数减 1。GROUP BY 子句与 MIN 和 MAX 以及 COUNT 函数一起允许我们获取第一个和最后一个日期以及空格数。
下面的代码应该是所需要的(其中数据是给定示例中的表格)。
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,使用顺序日期来计算它们之间的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31041940/