选择最小值并更新所有SQL行

选择最小值并更新所有SQL行,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个场景,我需要选取优先级列的最小值,然后取这些值的乘积并将其放入所有列中 SD PL PRIO PRDT PNAME 1 29 10 MM CAR 1 LI 20 SS BRAKE 1 AA 30 AA ZZZZ 由于优先级10是gorup SD的最小值,因此应按如下方式更换1 MM SD PL PRIO PRDT PNAME 1 29 10 MM CAR

我有一个场景,我需要选取优先级列的最小值,然后取这些值的乘积并将其放入所有列中

SD  PL  PRIO    PRDT    PNAME
1   29  10      MM     CAR
1   LI  20      SS     BRAKE
1   AA  30      AA     ZZZZ
由于优先级10是gorup SD的最小值,因此应按如下方式更换1 MM

 SD PL  PRIO    PRDT    PNAME
 1  29  10      MM       CAR
 1  LI  20      MM       BRAKE
 1  AA  30      MM       ZZZZ

请您帮助选择查询。

您可以使用
行号

SELECT
    t.SD, t.PL, t.PRIO, t2.PRDT, t.PNAME
FROM YourTable t
INNER JOIN(
    SELECT *,
        ROW_NUMBER() OVER(PARTITION BY SD ORDER BY PRIO) AS rn
    FROM YourTable
) t2
    ON t.SD = t2.SD
WHERE t2.rn = 1

使用相关子查询如何:

UPDATE YourTable t
    SET PRDT = (
        SELECT PRDT
        FROM YourTable t2
        WHERE 
            t2.SD = t.SD
            AND t2.PRIO = (SELECT MIN(t3.PRIO) FROM YourTable t3 WHERE t3.SD = t.SD)
    )

您可以使用
行编号

SELECT
    t.SD, t.PL, t.PRIO, t2.PRDT, t.PNAME
FROM YourTable t
INNER JOIN(
    SELECT *,
        ROW_NUMBER() OVER(PARTITION BY SD ORDER BY PRIO) AS rn
    FROM YourTable
) t2
    ON t.SD = t2.SD
WHERE t2.rn = 1

使用相关子查询如何:

UPDATE YourTable t
    SET PRDT = (
        SELECT PRDT
        FROM YourTable t2
        WHERE 
            t2.SD = t.SD
            AND t2.PRIO = (SELECT MIN(t3.PRIO) FROM YourTable t3 WHERE t3.SD = t.SD)
    )

如果只需要选择查询,请尝试此操作

SELECT COL1,
  COL2,
  MIN(COL3) OVER(PARTITION BY COL1 ORDER BY COL3 ASC) COL3,
  COL4,
  COL5
FROM
  (SELECT 1 COL1, '29' COL2, 10 COL3, 'MM' COL4, 'CAR' COL5 FROM DUAL
  UNION ALL
  SELECT 1 COL1, 'LI' COL2, 20 COL3, 'SS' COL4, 'BRAKE' COL5 FROM DUAL
  UNION ALL
  SELECT 1 COL1, 'AA' COL2, 30 COL3, 'AA' COL4 , 'ZZZZ' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, '29' COL2, 10 COL3, 'MM' COL4, 'CAR' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, 'LI' COL2, 05 COL3, 'SS' COL4, 'BRAKE' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, 'AA' COL2, 30 COL3, 'AA' COL4 , 'ZZZZ' COL5 FROM DUAL
  );

如果只需要选择查询,请尝试此操作

SELECT COL1,
  COL2,
  MIN(COL3) OVER(PARTITION BY COL1 ORDER BY COL3 ASC) COL3,
  COL4,
  COL5
FROM
  (SELECT 1 COL1, '29' COL2, 10 COL3, 'MM' COL4, 'CAR' COL5 FROM DUAL
  UNION ALL
  SELECT 1 COL1, 'LI' COL2, 20 COL3, 'SS' COL4, 'BRAKE' COL5 FROM DUAL
  UNION ALL
  SELECT 1 COL1, 'AA' COL2, 30 COL3, 'AA' COL4 , 'ZZZZ' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, '29' COL2, 10 COL3, 'MM' COL4, 'CAR' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, 'LI' COL2, 05 COL3, 'SS' COL4, 'BRAKE' COL5 FROM DUAL
  UNION ALL
  SELECT 2 COL1, 'AA' COL2, 30 COL3, 'AA' COL4 , 'ZZZZ' COL5 FROM DUAL
  );

我不想更新表。选择查询将有帮助。@Mani更新了我的答案。我不想更新表。“选择查询”会有帮助。@Mani更新了我的答案。它不是COL3的最小值。选择COL3等效COL4的最小值,并替换为COL4。它不是COL3的最小值。选择COL3等效COL4中的最小值,并替换为COL4。