我正在使用MySQL语法中的MariaDB 10.2.4,并尝试根据每个客户的每笔交易的行的时间戳(而不是日历日)来计算过去24小时内发生的交易数量。
列信息:
- row_number:我添加这个是为了方便阅读,它实际上并不存在
- order_no:每一行的唯一值
- customer_id:客户唯一,但在表中重复
- order_date:是一个时间戳,必须在其上执行计数
- dollar_value:是上下文,是一个小数
这里有一个手工制作的表格,显示我想要的输出是什么。输入将是所有相同的列,除了输出(transcount)和row_number列。
示例:
- 第3行。我感兴趣的时间范围是2022-02-11 22:53:50(order_date列中的值)到2022-02-10 22:53:50(order_date - interval 1 day),客户ID为1111171。第4行和第6行与此匹配,因此第3行的输出为3(包括第3行)。
- 第4行。客户1111171的时间范围是2022- 02-11 06:49:36到2022-02-10 06:49:36。第6、8、9、10行在时间范围内,并且是相同的customer_id,因此transcount值为5。
表
| 行数|订单号|客户标识|订货日期|美元价值|传输计数|
| --|--|--|--|--|--|
| 1 | 8888883 | 1111100 |2019 -02-14 01:10:04| 2256.0| 1 |
| 2 | 8888837 | 1111100 |2022-02-12 05:46:32|一四五七点二| 1 |
| 3 | 8888812 | 1111171 |2022-02-11 22:53:50|小行星1757.2| 3 |
| 4 | 8888887 | 1111171 |2022-02-11 06:49:36|一千三百五十点二| 5 |
| 5 | 8888804 | 1111100 |2022-02-11 03:10:07| 1853.6| 1 |
| 6 | 8888866 | 1111171 |2019 -02-11 01:20:26| 1053.0| 4 |
| 7 | 8888833 | 1111181 |2022-02-10 21:09:05|二百五十三点二| 1 |
| 8 | 8888874 | 1111171 |2022-02-10 18:06:55|小行星1958.6| 3 |
| 9 | 8888829 | 1111171 |2022-02-10 10:11:59|一四五六点二| 2 |
| 10 | 8888802 | 1111171 |2022-02-10 09:55:31|九百五十六点六| 1 |
| 11 | 8888835 | 1111100 |2022-02-09 19:40:24|七五六点四| 2 |
| 12 | 8888810 | 1111123 |2019 -02- 29 01:01:56|三一七九点五| 1 |
| 13 | 8888850 | 1111100 |2022-02-08 20:00:20| 629.0| 1 |
| 14 | 8888821 | 1111171 |2022-02-08 17:59:05|一千二百四十九点四五| 2 |
| 15 | 8888809 | 1111171 |2022-02-08 06:25:15|一千二百五十点零| 1 |
| 16 | 8888837 | 1111147 |2022-02-08 06:18:15|一百八十四点六| 1 |
| 17 | 8888836 | 1111171 |2022-02-07 12:01:47|八十八点二八| 1 |
| 18 | 8888808 | 1111147 |2022-02-05 12:02:49| 3008.7| 3 |
| 19 | 8888890 | 1111147 |2022-02-05 11:48:16| 1543.31| 2 |
| 20 | 8888805 | 1111147 |2022-02-05 11:37:55| 2617.4| 1 |
我还打算应用一些其他的过滤器,比如只计算1000以上的dollar_value,但我希望这不会影响计数的逻辑。
我已经能够在PySpark中做到这一点,但我不能重复同样的逻辑。
'''
# Function to calculate number of seconds from number of days
days = lambda i: i * 86400
# Create window by casting timestamp to long (number of seconds) then defining the number of days you wish to review
w = (Window.partitionBy('customer_id').orderBy(F.col(date_column).cast('long')).rangeBetween(-days(monitor_length_days), 0))
# Add total value of transactions undertaken within time frame by customer_id
filteredDF = filteredDF.withColumn(output_name, F.count('customer_id').over(w))
字符串
'''
如果你有任何问题,请告诉我,
1条答案
按热度按时间mftmpeh81#
不幸的是,MariaDB不允许你在一个时间段内创建一个窗口,所以你需要一个不同的方法。解决这个问题的一种方法是
JOIN
表本身,其中customer_id
值是相同的,而order_date
是在之前的24小时内。然后你可以计算连接表中的行来获得trans_count
值:字符串
输出(用于示例数据):
型
Demo on dbfiddle
请注意,对于第15行,
trans_count
应该是2
,因为在第17行的24小时内有一个先前的交易。