2015-05-14 72 views
-1

我需要找到日期,当每个用户支付的金额超过100美元。我有以下格式的表:找到销售ID达到一定水平的日期

+----------------------------------------+------------+----+ 
|  pay_date, user_id, transaction_sum |   | | 
+----------------------------------------+------------+----+ 
|  01/01/14, A1,  $2    |   | | 
|  01/01/14, A2,  $5    |   | | 
|  01/01/14, B1,  $10    |   | | 
|  03/01/14, A1,  $2    |   | | 
|  03/01/14, B1,  $2    |   | | 
|  03/01/14, C1,  $5    |   | | 
|  04/01/14, A3,  $2    |   | | 
|  04/01/14, A3,  $20    |   | | 
|  04/01/14, C1,  $5    |   | | 
+----------------------------------------+------------+----+ 
    ... 

(ordered by pay_date) 

我想结果,有一个像这样的表:

user_id, pay_date 
A1,  03/03/14 
A2,  30/03/14 
A3,  22/05/14 
B1,  01/01/15 
C1,  12/10/14 

的一些用户支付资金累计总金额将超过$ 100,但是我需要超过它的日期。对于其他用户,它不会超过,我不需要他们在表中。

道歉,如果我没有解释这显然不够 感谢

+0

您正在使用哪个数据库管理系统? (日期/时间功能通常是特定于产品的。) – jarlh

+0

到目前为止,您自己做了什么?任何努力? –

+0

@jarlh TransactSQL如果我正确理解你的问题(Amazon Redshift) –

回答

2

AFAIK红移支持窗口化聚合函数:

SELECT user_id, MIN(pay_date) 
FROM 
(
    SELECT pay_date, user_id, 
     SUM(transaction_sum) -- cumulative sum based on pay_date 
     OVER (PARTITION BY user_id 
      ORDER BY pay_date 
      ROWS UNBOUNDED PRECEDING) AS cum_sum 
    FROM tab 
) AS dt 
WHERE cum_sum > 100 -- only rows where cumulative sum exceeds limit 
GROUP BY user_id 
+0

非常感谢你,这是非常优雅的解决方案!我后悔我的名声不让我投票 –

0

您的例子是什么,是不是完全按照你的问题问。

如果你想你的榜样,那么你可以简单地做

select user_id, pay_date from TABLE where transaction_sum > 100; 
+0

谢谢你的回答,dnoeth给出了非常有用的建议 –