2017-03-05 27 views
-1

我想要一个sql,给出接收的数量> = 1024,传输数量为< = 3。如何获得数量大于一定数量的总和

例如,

enter image description here

结果是:

enter image description here

约翰逊列出,因为它已经接收到1112美元以下三个传输自 约翰逊帐户已列出:512美元+ 100美元+ 500美元,泰勒以1美元转让1024美元。威廉姆斯不在那里,因为他在四笔交易中获得1200美元。

我尝试

Select recipient as account_name from transfers group by recipient 
having sum(amount)>=1024 and count(amount)<=3 

它不能正常工作。 我正在使用PostgreSQL,SQLLites语法也很好。

附件为表和行创建您的方便

create table transfers (
     sender varchar(1000) not null, 
     recipient varchar(1000) not null, 
     date date not null, 
     amount integer not null 
); 

insert into transfers values('Smith','Taylor',convert(date,'2002-09-27'),'1024') 
insert into transfers values('Smith','Johnson',convert(date,'2005-06-26'),'512') 
insert into transfers values('Williams','Johnson',convert(date,'2010-12-17'),'100') 
insert into transfers values('Williams','Johnson',convert(date,'2004-03-22'),'10') 
insert into transfers values('Brown','Johnson',convert(date,'2013-03-20'),'500') 
insert into transfers values('Johnson','Williams',convert(date,'2007-06-02'),'400') 
insert into transfers values('Johnson','Williams',convert(date,'2005-06-26'),'400') 
insert into transfers values('Johnson','Williams',convert(date,'2005-06-26'),'200') 
+1

你的SQL意味着该人在有3周或更少的交易,而不是表示3或更少的数量超过了1024 –

回答

9

使用row_number()和派生表限制每个recipient他们的前3金额收到,然后通过recipient分组返回那些sum(amount)>=1024

select recipient as account_name 
from (
    select * 
    , row_number() over (
     partition by recipient 
     order by amount desc 
     ) as rn 
    from transfers 
) as i 
where rn < 4 
group by recipient 
having sum(amount)>=1024 

回报:

+--------------+ 
| account_name | 
+--------------+ 
| Johnson  | 
| Taylor  | 
+--------------+ 

rextester Postgres的演示:http://rextester.com/PFR74297


此问题已编辑了移除了一些3rd revision of the question相关信息:发生了什么已经尝试过。

我尝试

Select recipient as account_name from transfers group by recipient
having sum(amount)>=1024 and count(amount)<=3

它不能正常工作。

根据掌握的信息,我的结论是,OP想找到recipients从3或任何接收方转让的较少收到sum(amount)>=1024 - 不限于与3个或更少的传输和sum(amount)>=1024这些收件人。

+1

这个答案是错误的。如果某个收件人收到多次转帐,则会将这3笔最大金额相加,而OP则要求转账金额不超过3次。 – Patrick

+12

@帕特里克我明白你为什么会认为我的答案错了,但是OP编辑了这个问题并删除了一些非常重要的信息。我进入前三名的原因是因为OP说'总和(金额)> = 1024,而计数(金额)<= 3“并不能提供他想要的结果。我已经回过头来再次提供这些信息。 – SqlZim

+0

首先,您应该**从不回滚OP **所做的编辑,以证明您的观点。其次,你的回答并没有充分解决在任何时候都存在的开放性问题陈述,OP删除但你回滚的文本也没有使你的答案正确。这两种方式都是错误的。作为SO上的既定用户,您应该知道并接受您唯一可行的行为是删除您的答案; [Roman Tkachuk](http://stackoverflow.com/a/42610273/3304426)提供了一个完美的解决方案。 – Patrick

2

如果我理解正确,而这需要:

SELECT recipient 
    FROM transfers 
GROUP BY 1 
HAVING count(*) < 4 
    AND sum(amount)>=1024 
0

使用SQLite,没有花哨的功能:)工作液

SELECT recipient AS account_name FROM 
    (
     SELECT transfers.recipient, SUM(transfers.amount) AS amountsum FROM transfers 
     WHERE transfers.rowid IN (
             SELECT tmp.rowid FROM transfers tmp 
             WHERE transfers.recipient = tmp.recipient 
             ORDER BY tmp.amount DESC 
             LIMIT 3 
           ) 
     GROUP BY transfers.recipient 
    ) 
WHERE amountsum >= 1024;