计算特定用户在过去 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 小时内的唯一值