跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢相关的知识,希望对你有一定的参考价值。
如题:org_info 表内容如下:
ID NAME TEL ADDR OP_TYPE OCCUR_DATE
1001 aaa 888888 ppppppp 2014-07-23
1001 aaa 999999 ppppppp 2011-03-19
1002 bbb 666666 yyyyyyy 2014-09-15
1002 ipow 221 fghfghfh 2009-07-08
1002 ipow 221 iyyiwqwe 2006-02-24
1002 bbb 666666 yyyyyyy 2001-05-12
update (select row_number() over(partition by id order by occur_date ASC) RN,
oi.* from org_info oi) aa
set aa.op_type = 1 where aa.RN = 1
数据库报错:
ORA-01732: 此视图的数据操纵操作非法
请问这为什么错?如果不能这样写,那么用什么方式还能实现此功能呢?谢谢~~~~
(希望实现按照ID分组,取出日期最小的那条记录,将他字段OP_TYPE更新为1,求指导啊~~~)
如果是日期最小的记录,可以直接用min。
update org_infoset op_type = 1
where occur_date in (select min(occur_date) from org_info group by id)追问
这样不行啊,按照id分组后,如果第一组数据最小的日期是1月1号,此外第二组最小的日期是1月10号,但是第二组数据中刚好有一条数据也是1月1号,那岂不是把这也更新了?
追答update org_info
set op_type = 1
where (occur_date,id) in (select min(occur_date),id from org_info group by id)
能否具体写一下啊?
谢谢
定义个 游标=select row_number() over(partition by id order by occur_date ASC
然后循环游标 ,逐个更新 ,具体语法百度吧。
mysql:update select groupby orderby(分组排序后更新第一条数据)
参考技术A有时候我们需要更新table中分组排序后的第一条数据。比如:给各学科分数第一名的学生打标。
如上图所示,现在有一张学生成绩表,我想要各科第一名的学生打标,也就是向mark字段中写入“第一名”标记。那么预想得到的效果应该是这样的:
由于需要使用到group by , 所以需要先检查下mysql对应的sql_mode 是否包含 ONLY_FULL_GROUP_BY ,如果包含,则将sql_mode中的ONLY_FULL_GROUP_BY移除掉,否则下面的SQL可能执行不成功
上面sql中t0表为什么需要使用到DISTINCT,可以查看文章:
执行结果:
SQL分析:
上面的SQL感觉还是过于复杂了,看过下面的文章后:
可以将上面的SQL优化优化.....
优化版写法:
执行结果:
SQL分析:
执行结果:
SQL分析:
上面的SQL中使用到了窗口函数,关于窗口函数相关文章:
以上是关于跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢的主要内容,如果未能解决你的问题,请参考以下文章
mysql:update select groupby orderby(分组排序后更新第一条数据)
oracle数据库如何用update批量更新某列数据中的字段