假设我有A表,里面有id ,name,code,chengji字段
现在我要按名字分组,更新按名字分组后的前两行的code字段为"101".
比如: id name code chengji
1 刘德华 90 90
2 刘德华 81 70
3 刘德华 100 70
4 张学友 91 70
5 张学友 90 80
更新后的结果是
id name code chengji
1 刘德华 101 90
2 刘德华 101 70
3 刘德华 100 70
4 张学友 101 70
5 张学友 101 80
现在我要按名字分组,更新按名字分组后的前两行的code字段为"101".
比如: id name code chengji
1 刘德华 90 90
2 刘德华 81 70
3 刘德华 100 70
4 张学友 91 70
5 张学友 90 80
更新后的结果是
id name code chengji
1 刘德华 101 90
2 刘德华 101 70
3 刘德华 100 70
4 张学友 101 70
5 张学友 101 80
DROP TABLE test;
CREATE TABLE test (id INT, NAME VARCHAR2(20), code INT, chengji INT);INSERT INTO TEST VALUES (1, '刘德华', 90, 90);
INSERT INTO TEST VALUES (2, '刘德华', 81, 70);
INSERT INTO TEST VALUES (3, '刘德华', 100, 70);
INSERT INTO TEST VALUES (4, '张学友', 91, 70);
INSERT INTO TEST VALUES (5, '张学友', 90, 80);
COMMIT;
SELECT ID,
NAME,
CASE
WHEN RN <= 2 THEN
101
ELSE
CODE
END,
CHENGJI
FROM (SELECT ID,
NAME,
CODE,
CHENGJI,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) RN
FROM TEST);
输出:
1 刘德华 101 90
2 刘德华 101 70
3 刘德华 100 70
4 张学友 101 70
5 张学友 101 80
SQL> SELECT * FROM TEST_22; SID SNAME CODE CHENGJI
---------- -------------------- ---------- ----------
1 ANDY 90 90
2 ANDY 81 70
3 ANDY 100 70
4 ZHANG 91 70
5 ZHANG 90 80SQL>
SQL> UPDATE TEST_22 TT
2 SET TT.CODE = 101
3 WHERE EXISTS (SELECT *
4 FROM TEST_22 T1
5 WHERE (
6 SELECT COUNT(1)
7 FROM TEST_22 T2
8 WHERE T1.SNAME = T2.SNAME
9 AND T1.SID > T2.SID
10 ) <= 1
11 AND TT.SID = T1.SID);4 rows updatedSQL> COMMIT;Commit completeSQL> SELECT * FROM TEST_22; SID SNAME CODE CHENGJI
---------- -------------------- ---------- ----------
1 ANDY 101 90
2 ANDY 101 70
3 ANDY 100 70
4 ZHANG 101 70
5 ZHANG 101 80SQL>
(select case when tt<3 then '101' else to_char(code) end from
(select id,
name,
code,
chengji,
row_number() over(partition by name order by id) tt
from test) b where a.id=b.id)
where exists(select 1 from test b
where a.id=b.id)结果为:
1 1 刘德华 101 90
2 2 刘德华 101 70
3 3 刘德华 100 70
4 4 张学友 101 70
5 5 张学友 101 80
我sql比较差,看样子还得看书去啊
如果不用case when可以用decode()
decode(rn,1,'101',2,'101',code)