mariadb 如何在由每个事务的单个行数据时间戳定义的时间段内对事务进行计数

5f0d552i  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(69)

我正在使用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))

字符串
'''
如果你有任何问题,请告诉我,

mftmpeh8

mftmpeh81#

不幸的是,MariaDB不允许你在一个时间段内创建一个窗口,所以你需要一个不同的方法。解决这个问题的一种方法是JOIN表本身,其中customer_id值是相同的,而order_date是在之前的24小时内。然后你可以计算连接表中的行来获得trans_count值:

SELECT o.customer_id, o.order_date,
       COUNT(c.customer_id) AS trans_count
FROM orders o
JOIN (SELECT customer_id, order_date
     FROM orders
     ) c ON c.customer_id = o.customer_id AND c.order_date BETWEEN o.order_date - INTERVAL 1 DAY AND o.order_date
GROUP BY o.customer_id, o.order_date
ORDER BY o.order_date DESC

字符串
输出(用于示例数据):

customer_id order_date              trans_count
1111100     2022-02-14 01:10:04     1
1111100     2022-02-12 05:46:32     1
1111171     2022-02-11 22:53:50     3
1111171     2022-02-11 06:49:36     5
1111100     2022-02-11 03:10:07     1
1111171     2022-02-11 01:20:26     4
1111181     2022-02-10 21:09:05     1
1111171     2022-02-10 18:06:55     3
1111171     2022-02-10 10:11:59     2
1111171     2022-02-10 09:55:31     1
1111100     2022-02-09 19:40:24     2
1111123     2022-02-09 01:34:56     1
1111100     2022-02-08 20:00:20     1
1111171     2022-02-08 17:59:05     2
1111171     2022-02-08 06:25:15     2
1111147     2022-02-08 06:18:15     1
1111171     2022-02-07 12:01:47     1
1111147     2022-02-05 12:02:49     3
1111147     2022-02-05 11:48:16     2
1111147     2022-02-05 11:37:55     1


Demo on dbfiddle
请注意,对于第15行,trans_count应该是2,因为在第17行的24小时内有一个先前的交易。

相关问题