group by求序列号最大的余额

oceanmengweixin 2019-06-06 10:42:10
怎么group by求序列号最大的余额,下面红色的,语法报错
select zoneno,count(1),sum(amount),
case when serialno =max(serialno) then balance end as max_balance
from table group by zoneno


serialno zoneno amount balance
001 2100 100.00 5000
002 2100 50.00 5050
003 2100 150.00 5200
004 2100 -10.00 5190
005 2200 120.00 120
006 2200 40.00 160
007 2200 300.00 460
...全文
464 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinuo2015 2019-08-31
  • 打赏
  • 举报
回复
用窗口和分析函数可以这样写:
select zoneno,balance,count1,sum1
from (select zoneno,
balance,
row_number() over(partition by zoneno, order by serialno desc) rn,
count(1) over(partition by zoneno) count1,
sum(amount) over(partition by zoneno) sum1
from table ) t
where t.rn = 1;

不用的话也可以用join来做,不过如果serialno有重复的话效果会不一样:
select a.zoneno,a.balance,b.count1,b.sum1
from table a
inner join (select zoneno,max(serialno) max_serialno,count(1) count1,sum(amount) sum1 from table group by zoneno) b
on (a.zoneno = b.zoneno and a.serialno = b.max_serialno);
magic_kid_2010 2019-08-27
  • 打赏
  • 举报
回复
select zoneno,max(balance) from table group by zoneno
ackor 2019-07-19
  • 打赏
  • 举报
回复
使用分析函数可以很方便写出来,如果是mysql可以先按serialno排序,然后包多一层再group by zoneno


这语句支持hive,oracle等支持分析函数的数据库,mysql 8.0以下不支持
select *
from (
select *,row_number() over(partition by zoneno order by serialno desc) as rn from table
) t1
where t1.rn = 1
;
秦拿希 2019-07-05
  • 打赏
  • 举报
回复
问题都没描述清楚
x_xf 2019-07-04
  • 打赏
  • 举报
回复
SQL 做这种运算很麻烦,可以写集算器的SPL来实现,代码简单易懂:

A1:$select * from db
A2:=A1.group(zoneno;~.max(serialno):Sno,~.select(serialno==Sno).amount:amount)

20,809

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧