PL / SQL更新除最大值之外的所有记录

时间:2017-10-19 10:50:20

标签: sql plsql oracle11g

请帮助SQL查询。我有一张桌子:

CREATE TABLE PCDEVUSER.tabletest
(
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR2(64),
    pattern INT DEFAULT 1 NOT NULL,
    tempval INT
);

让我们假装它充满了价值观:

INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (1, 'A', 1, 10);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (2, 'A', 1, 20);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (3, 'A', 2, 10);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (5, 'A', 2, 20);
INSERT INTO TABLETEST (ID, NAME, PATTERN, TEMPVAL) VALUES (4, 'A', 2, 30);

我需要使用NO MAX值TEMPVALUE更新所有记录(按模式分组)。因此,我必须用Ids(1,3,5)更新记录。具有ID(2,4)的记录在PATTERN组中具有最大值。

帮助PLZ

2 个答案:

答案 0 :(得分:1)

此select语句将帮助您获取所需的ID:

SELECT
 *
FROM
 (SELECT
   id
  ,name
  ,pattern
  ,tempval
  ,MAX(tempval) OVER (PARTITION BY pattern)  max_tempval
  FROM
   tabletest
 )
WHERE 1=1
AND tempval != max_tempval
;

您应该能够轻松地构建更新声明

答案 1 :(得分:0)

这样的事情:

update tabletest t
    set ????
    where t.tempval < (select max(tempval) from tabletest tt where tt.pattern = t.pattern);

目前还不清楚您要设置哪些值。 ????用于设置值的代码。