计算特定用户在过去 1 小时内的交易数量

Posted

技术标签:

【中文标题】计算特定用户在过去 1 小时内的交易数量【英文标题】:Counting number of transactions within past 1 hour on a particular user 【发布时间】:2018-07-31 11:43:45 【问题描述】:

有什么方法可以(在最好的情况下,不使用光标)计算同一用户在前 1 小时内进行的交易数量。

这意味着对于这个表

CREATE TABLE #TR (PK INT, TR_DATE DATETIME, USER_PK INT)

INSERT INTO #TR VALUES (1,'2018-07-31 06:02:00.000',10)
INSERT INTO #TR VALUES (2,'2018-07-31 06:36:00.000',10)
INSERT INTO #TR VALUES (3,'2018-07-31 06:55:00.000',10)
INSERT INTO #TR VALUES (4,'2018-07-31 07:10:00.000',10)
INSERT INTO #TR VALUES (5,'2018-07-31 09:05:00.000',10)
INSERT INTO #TR VALUES (6,'2018-07-31 06:05:00.000',11)
INSERT INTO #TR VALUES (7,'2018-07-31 06:55:00.000',11)
INSERT INTO #TR VALUES (8,'2018-07-31 07:10:00.000',11)
INSERT INTO #TR VALUES (9,'2018-07-31 06:12:00.000',12)

结果应该是:

解决方案可能类似于:COUNT(*) OVER (PARTITION BY USER_PK ORDER BY TR_DATE ROWS BETWEEN ((WHERE DATEADD(HH,-1,PRECENDING.TR_DATE) > CURRENT ROW.TR_DATE) AND CURRENT ROW ...但我知道 ROWS BETWEEN 不能这样使用...

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

我根据语法猜测 SQL Server。在 SQL Server 中,可以使用apply:

select t.*, tr2.result
from #tr tr outer apply
     (select count(*) as result
      from #tr tr2
      where tr2.user_id = tr.user_id and
            tr2.tr_date > dateadd(hour, -1, tr.date) and
            tr2.tr_date <= tr.tr_date
     ) tr2;

【讨论】:

【参考方案2】:
SELECT USER_PK, COUNT(*) AS TransactionCount
FROM #TR
WHERE DATEDIFF(MINUTE, TR_DATE, GETDATE()) <= 60
AND DATEDIFF(MINUTE, TR_DATE, GETDATE()) >= 0
GROUP BY USER_PK

您可以随意更改GETDATE(),但它们需要具有相同的值

【讨论】:

这个解决方案给你另一个结果。解决方案应该类似于: COUNT(*) OVER (PARTITION BY USER_PK ORDER BY TR_DATE ROWS BETWEEN ((WHERE DATEADD(HH,-1,PRECENDING.TR_DATE) > CURRENT ROW.TR_DATE) AND CURRENT ROW ...但我知道ROWS BETWEEN 不能这样使用... 您找到解决方案了吗?请改善您的预期结果

以上是关于计算特定用户在过去 1 小时内的交易数量的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 时间序列数据 - 每 30 分钟计算过去 24 小时内的唯一值

使用 pandas 时间序列在过去 n 小时内的变化率

在 Bigquery 中计算过去 3 个月内活跃的供应商数量

mysql 在过去 N 小时内的简单移动平均线

时间间隔内的 SQL 计数

MySql 我如何返回过去 60 天和不在 60 天内的多个特定 ID?