0

我有一张有客户的表,我想找出客户在哪一个月遇到或超过了一定数量的请求。

该表有 customer_id 每个请求的时间戳。

我要查找的是客户满足或超过 10000 个请求的月份(或日期)。我试图得到一个运行总数,但这对我不起作用。我把它留在了代码中,以防有人知道我该怎么做。

我所拥有的是以下内容:

SELECT 
       customer_id
       , DATE_TRUNC(CAST(TIMESTAMP_MILLIS(created_timestamp) AS DATE), MONTH) as cMonth
       , COUNT(created_timestamp) as searchCount
--     , SUM(COUNT (DISTINCT(created_timestamp))) OVER (ROWS UNBOUNDED PRECEDING) as RunningTotal2
FROM customer_requests.history.all
GROUP BY distributor_id, cMonth
ORDER BY 2 ASC, 1 DESC;

我所追求的代表是这样的。

customer    requests    cMonth       totalRequests
cust1       6000         2017-10-01  6000
cust1       4001         2017-11-01  10001
cust2       4000         2017-10-01  4000
cust2       4000         2017-11-01  8000
cust2       4000         2017-12-01  12000
cust2       3000         2017-12-01  3000
cust2       3000         2017-12-01  6000
cust2       3000         2017-12-01  9000
cust2       3000         2017-12-01  12000
4

3 回答 3

0

如果你想要一个累积和,你可以使用窗口函数。在标准 SQL 中,这看起来像:

SELECT customer_id, 
       DATE_TRUNC(CAST(TIMESTAMP_MILLIS(created_timestamp) AS DATE), MONTH) as cMonth
       COUNT(*) as searchCount,
       SUM(COUNT(*)) OVER (ORDER BY MIN(created_timestamp) as runningtotal
FROM customer_requests.history.all
GROUP BY distributor_id, cMonth
ORDER BY 2 ASC, 1 DESC;
于 2018-09-10T22:02:59.037 回答
0

这是我的解决方案。

SELECT
  customerid
 ,SUM(requests) sumDay
 ,created_timestamp
FROM yourTable
GROUP BY 
  customerid,
  created_timestamp
HAVING SUM(requests) >= 10000;

它很简单。您只需根据需要进行分组,总结请求并选择符合您的 HAVING 子句的行。您可以在这里尝试查询。

于 2018-09-10T20:29:56.177 回答
0

假设 SQL Server,试试这个(调整顶部的截止以获得您需要的事务数;现在它寻找每个客户的第 1000 个事务)。

请注意,这不会返回未超过您的截止日期的客户,并假设每笔交易都有一个唯一的日期(或者如果日期可能存在平局,则会发出一个连续的 ID 号以打破平局)。

DECLARE @cutoff INT = 1000;
WITH CTE
AS (SELECT customer_id,
           transaction_ID,
           transaction_date,
           ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY transaction_date, transaction_ID) AS RN,
           COUNT(transaction_ID) OVER (PARTITION BY customer_id) AS TotalTransactions
    FROM #test)
SELECT DISTINCT
       customer_id,
       transaction_date as CutoffTransactionDate,
       TotalTransactions
FROM CTE
WHERE RN = @cutoff;

这个怎么运作:

row_number为每个客户的交易分配一个唯一的顺序标识符,按照它们进行的顺序。 count告诉您一个人进行的交易总数(再次假设每笔交易一条记录 - 否则您需要单独计算,因为distinct无法使用partition)。

然后第二个select返回每个客户的第 1,000 行(或您指定的任何数量)及其日期,以及该客户的总数。

于 2018-09-10T20:01:09.467 回答