【发布时间】:2025-12-09 01:15:01
【问题描述】:
假设我有以下交易数据:
+--------------------------------------------------+
| CustomerID | TransactionID | TransactionDate |
+--------------------------------------------------+
| 1 | 1 | 2015-01-22 15:09:43 |
| 1 | 2 | 2015-01-22 16:58:13 |
| 1 | 3 | 2015-01-23 07:05:53 |
| 2 | 4 | 2015-02-02 21:12:28 |
| 2 | 5 | 2015-02-02 22:01:59 |
| 3 | 6 | 2015-02-03 19:50:47 |
| 2 | 7 | 2015-02-04 16:12:08 |
| 4 | 8 | 2015-02-05 17:13:29 |
+--------------------------------------------------+
TransactionDate,顺便说一句,存储为 unix 时间戳,而不是日期的字符串表示形式。我只是对其进行了转换,以便在此处阅读。
我正在尝试制作一个查询,以告诉我哪些客户(按 ID)在 24 小时内购买了 3 次或更多次。在这个(当然是基本的)示例中,唯一符合该标准的客户是 #1,因为这三笔交易都发生在 24 小时内。客户 #2 不会,因为 24 小时内只发生了两笔交易;第三个是在第一个的 24 小时窗口之外。我只关心客户 ID;我不需要知道涉及哪些交易或实际交易日期。目前我正在通过代码执行此操作 - 运行将上面的表返回到 PHP 数组的查询,使用如下代码转换结果:
foreach ($results as $result)
$data[$result['CustomerID']][] = array(
'TransactionID' => $result['TransactionID'],
'TransactionDate' => $result['TransactionDate']
);
...这给了我一个这样的数组...
$data = array(
'1' => array(
array(
'TransactionID' => '1',
'TransactionDate' => '2015-01-22 15:09:43'
),
array(
'TransactionID' => '2',
'TransactionDate' => '2015-01-22 16:58:13'
),
array(
'TransactionID' => '3',
'TransactionDate' => '2015-01-23 07:05:53'
),
),
'2' => array(
array(
'TransactionID' => '4',
'TransactionDate' => '2015-02-02 21:12:28'
),
array(
'TransactionID' => '5',
'TransactionDate' => '2015-02-02 22:01:59'
),
array(
'TransactionID' => '7',
'TransactionDate' => '2015-02-04 16:12:08'
),
),
// etc.
)
...然后遍历每个客户,看第三条记录是否在第一条记录的24小时内,第四条记录是否在第二条记录的24小时内等等,取决于那里有多少购买记录在该时间段内为该客户服务。如果在任何时候我在 24 小时窗口内找到三条记录,我标记该客户 ID 并继续下一条(我真的不在乎我找到了多少 24 小时 3+ 交易块,只是我发现至少一个)。
如果它像 8 条交易记录一样简单,我很乐意将其保留为我在此处概述的一些程序代码;但是当我将 92,000 条记录从数据库拖入 PHP 进行处理时(每条记录更像是 70 个字段,而不是 3 个),我开始遇到严重的内存和超时问题。我知道,因为我以前处理过大型数据集(数百万行),所以任何值得其盐的数据库服务器都可以比在 Apache 下作为模块运行的 PHP 更快地处理这些类型的计算。我不知道的是如何在查询环境中直接计算记录之间的时间。这种处理甚至在 MySQL 中是可能的吗?
【问题讨论】:
-
你可以在mysql中使用
TIMEDIFF()。 -
我试图不在我的存储过程中按程序循环遍历 90,000 条记录。理想情况下,我希望
timediff()结果成为查询中的计算列,然后我可以使用HAVING子句将其挑选出来。更多的是能够制作一个查询,其中第 n 行是根据第 n-1 行的内容计算的。