2017-03-05 82 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;