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

PL/SQL更新除最大值以外的所有记录,sql,plsql,oracle11g,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, 1

请帮助进行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);
我需要更新所有按模式分组的记录,没有最大值TEMPVALUE。因此,我必须更新ID为1、3、5的记录。ID为2、4的记录在模式组中具有最大值

帮助PLZ

类似以下内容:

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

不清楚要设置什么值。这个用于设置值的代码。

此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
;

你应该能够很容易地围绕这一点构建更新语句

你想用什么值来更新它们?谢谢你,伙计。再一次,我看到了“按模式过度划分”的构造。也许你可以告诉我在哪里更好地学习它-我不明白:@R1K0:只要搜索Oracle分析函数-那里有很多好东西。还有人-关于“1=1”条件呢-或者在使用visual SQL之后呢这只是习惯——我总是把这种情况放在眼里。这是因为我经常想注释where子句中的行。如果第一行在哪里。。。是有意义的,那么如果您想注释掉它,您需要将WHERE语句下移到下一行。如果第一行是1=1,我知道我永远不想评论那行。好主意。开始使用它: