【问题标题】:How to get summation with count larger than certain amount如何获得计数大于一定数量的总和
【发布时间】:2017-03-05 13:37:35
【问题描述】:

我想要一个 sql 给接收者的金额 >= 1024,转账次数

例如,

结果是:

约翰逊的上市时间 列出 Johnson 账户是因为它在以下三笔转账中收到了 1112 美元:512 美元 + 100 美元 + 500 美元,泰勒有一笔 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')

【问题讨论】:

  • 你的SQL表示这个人有3次以下的交易,并不是说3次以下的金额超过1024

标签: sql postgresql sqlite


【解决方案1】:

使用row_number() 和派生表将每个recipient 限制为收到的前3 个金额,然后按recipient 分组返回具有sum(amount)&gt;=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)&gt;=1024 and count(amount)&lt;=3

它不能正常工作。

基于该信息,我得出结论,OP 希望从该收件人的任何 3 次或更少的转账中找到收到 sum(amount)&gt;=1024recipients - 不限于那些有 3 次或更少转账的收件人和 sum(amount)&gt;=1024 .

【讨论】:

  • 这个答案是错误的。如果某个收款人收到多次转账,这将合计 3 笔最大的金额,而 OP 要求提供有 3 次或更少转账的姓名。
  • @Patrick 我理解为什么你会认为我的回答是错误的,但是 OP 编辑​​了问题并删除了一些非常重要的信息。我获得前三名的原因是因为 OP 说 having sum(amount)&gt;=1024 and count(amount)&lt;=3 没有提供他想要的结果。我已回滚问题以再次包含该信息。
  • 首先,您应该永远不要回滚 OP 所做的编辑,以证明您的观点。其次,您的答案没有充分解决一直存在的开放问题陈述,OP删除但您回滚的文本也没有使您的答案正确。无论哪种方式,这都是完全错误的。作为 SO 的老用户,您应该知道并接受您唯一可行的做法是删除您的答案; Roman Tkachuk 提供了一个完美的解决方案。
  • @Patrick 您不应该进行破坏问题的编辑,即使您是 OP,这样的编辑也不行。回滚破坏问题的编辑是完全合适的,无论是谁进行了编辑。问题编辑的问题是discussed on meta,如果您想进一步讨论这个问题,请在那里进行。
  • @Patrick - OP 要求包含超过 3 次转账的人 - 请参阅提供的示例以及尽管有 4 次转账但仍应包括 Johnson 的原因,即因为 Johnson 有三笔交易,自己加起来至少是 1024。
【解决方案2】:

如果我理解正确,你更需要这个:

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

【讨论】:

    【解决方案3】:

    使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2013-06-07
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      相关资源
      最近更新 更多