oracle SQL 取出每个分组的按照日期最新一条记录,同时还显示每个分组某个字段的总和

如:table test
code num price date
a 1 10.00 2014-04-01
a 2 20.00 2014-04-02
a 3 30.00 2014-04-03
b 2 20.00 2014-04-07
b 1 10.00 2014-04-03
b 5 22.00 2014-04-01
以code 字段分组,并取每个分组日期最新的一条记录以及每个分组num字段的值的总和
结果:
code num price date SUM(num)
a 3 30.00 2014-04-03 6
b 2 20.00 2014-04-07 8

--用外链接把AA表和CC表链接起来查询就可以了
SELECT AA.CODE, AA.NUM, AA.PRICE, CC.DATETIME, CC.SUMNUM
  FROM test AA
  --下面的BB表查询的是根据code分组查询num求和及最大datetime,之后作为一个表CC
  LEFT JOIN (SELECT BB.CODE, SUM(NUM) SUMNUM,MAX(BB.DATETIME) DATETIME
               FROM test BB
              GROUP BY BB.CODE) CC
    ON AA.CODE = CC.CODE
 WHERE AA.DATETIME = CC.DATETIME

 --其中DATETIME字段就是你表中的date字段

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-04-02
select code,num,price,date,sum_num
from (
select code,num,price,date,row_number() over (partition by code order by date desc) rn,
sum(num) over (partition by code) sum_num
from table_name --这一行之前没加,引起误会,抱歉..
) a
where rn=1本回答被提问者采纳
第2个回答  2014-05-14
使用组函数SQL和表连接来实现,代码如下:
select aa.*,bb.sumnum from (select * from test where (code,date) in (select code,max(date) from test group by code)) as aa join (select code,sum(num) as sumnum from test group by code) as bb on aa.code==bb.code
第3个回答  2014-05-14
select a.code,a.num,a.price,a.date1,b.sum1
from test a,(select code,max(date1) date1,sum(num) sum1 from test group by code) b
where a.code=b.code and a.date1=b.date1
;
code和date做为组合关键字必需唯一,否则没法实现你目前的需求

oracle SQL 取出每个分组的按照日期最新一条记录,同时还显示每个分组...
之后作为一个表CC LEFT JOIN (SELECT BB.CODE, SUM(NUM) SUMNUM,MAX(BB.DATETIME) DATETIME FROM test BB GROUP BY BB.CODE) CC ON AA.CODE = CC.CODE WHERE AA.DATETIME = CC.DATETIME --其中DATETIME字段就是你表中的date字段 ...

SQL 取出每个分组的第一条记录,同时还显示每个分组某个字段的总和
drop table [dbo].[##tableA]--以第一条记录创建临时表 --注:根据你的要求,追加了一个用来确定组内记录序号的字段row_order,-- 因为如果没有这个字段,没有办法实现取得你说的那样的第1条记录的。select A='a',B=1,C='w',D='b',row_order=1 into ##tableA --将其余5个记录...

sql如何分组选择显示最新的一条数据
row_number() over(partition by 采购类别 order by 订货总额 desc) rn from table_name) awhere rn<=2 ;其次,常用数据库比如Oracle和Sqlserver都有特定函数完成分组排序的功能,如果需要显示并列的情况可以用下面另外的2个.分别有3个类似函数:row_number() over 这个函数不需要考虑是否并列,哪怕根...

oracle中怎么查询表中一个字段,并统计字段中每一个值的条数
简单的 统计整个表,就是一个分组、合计sql SELECT f.统计字段,COUNT(1)FROM 表名 f GROUP BY f.统计字段

Sql查询距离指定日期最近日期的一条数据
不同数据库有不同的写法,不过思路是一样的,就是字段的日期形式减去2008-12-20,然后取绝对值的最小值。找到这个最小值就可以了。枚举2个数据库的写法 MS SQL SERVER,select * from table_name where abs(column_name-convert(datetime,'20081220',112)) in (select min(abs(column_name-convert...

oracle sql查询完成分组并只返回每组的最小最大值
我的测试表里有7条数据。每3条数据分作一组求最小和最大id。WITH tmp ("id") AS (SELECT 1 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNION ALLSELECT 3 FROM DUAL UNION ALLSELECT 4 FROM DUAL UNION ALLSELECT 5 FROM DUAL UNION ALLSELECT 6 FROM DUAL UNION ALLSELECT 7 FROM DUAL ) ...

oracle数据表中根据时间字段获得最新一条记录的最高效率sql写法是那样...
select * from table where 时间字段 = (select max( 时间字段) from table)当然 时间字段 需要有索引

SQL 取出时间在当前时间前后最近的两条记录
union select * from TABLE1 where create_date = current_time and rownum = 1 意思就是取得小于目标时间的最大的一条记录和大雨目标时间的最小的一条记录以及等于目标时间的一条记录的结果集。因为oracle没有类似于sql server的limit和top这些函数,只能通过排序来取得最近的记录,如果是sql ...

oracle 求sql语句 按照日期范围分组查询。请务必写出测试过的代码,有难...
to_date('2013-05-23','yyyy-mm-dd'),'b',900);with t as(select rownum rn,to_char(trunc(to_date('2012-01-01','yyyy-mm-dd'),'d')+rownum*7+1,'yyyy-mm-dd') time1,to_char(trunc(to_date('2012-01-01','yyyy-mm-dd'),'d')+(rownum+1)*7,'yyyy-mm-dd') time...

sql去重,同一个字段出现多条取一条的sql语句
首先,当要求按某字段分组并取每组中的第一条记录时,可以使用如下SQL语句:SELECT b.* FROM (SELECT a.*,ROW_NUMBER() OVER (PARTITION BY a.column) AS group_idx FROM table_name a) b WHERE b.group_idx = '1'这里,ROW_NUMBER()函数在按column字段分组的条件下,为每组数据分配一个...

相似回答