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

时间:2016-06-10 04:21:40

标签: 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
 1  LI  20      MM       BRAKE
 1  AA  30      MM       ZZZZ

请帮助您选择查询。

2 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER

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)
    )

答案 1 :(得分:0)

如果您只想要SELECT Query,请尝试此操作。

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