【问题标题】:Select Min value row in oracle在oracle中选择最小值行
【发布时间】:2015-02-12 17:55:53
【问题描述】:

我想选择具有min price 的整个row。因为我需要更多列的数据来显示最低价格。如下所示。

 SELECT ep.*, min(ep.price) minprice FROM Equip_price ep;

如何使用 Oracle DB?


更新

我实际上想通过设备 ID 获取设备价格。 以下是示例数据。

  pid   equipmentID     price
  1        1              50
  2        2              20
  3        1             100
  4        1              20
  5        3             100
  6        3              10
  7        1              20

我想要这样的结果。 (按设备 ID 划分的最低价格组)

 id   equipmentID     price
  4        1              20
  2        2              20     
  6        3              10      

【问题讨论】:

    标签: sql oracle oracle11g min


    【解决方案1】:

    更新具体答案:

    SQL> WITH Equip_price AS
      2    ( SELECT 1 pid, 1 equipmentID, 50 price FROM dual
      3    UNION ALL
      4    SELECT 2 , 2 , 20 FROM dual
      5    UNION ALL
      6    SELECT 3 , 1 , 100 FROM dual
      7    UNION ALL
      8    SELECT 4 , 1 , 20 FROM dual
      9    UNION ALL
     10    SELECT 5 , 3 , 100 FROM dual
     11    UNION ALL
     12    SELECT 6 , 3 , 10 FROM dual
     13    UNION ALL
     14    SELECT 7 , 1 , 20 FROM dual
     15    )
     16  SELECT ep.pid,
     17         ep.equipmentID,
     18         ep.price
     19   FROM (
     20         SELECT ep.*,
     21                row_number() OVER(PARTITION BY ep.equipmentID ORDER BY ep.price)
     22                  AS row_identifier
     23         FROM Equip_price ep
     24        ) ep
     25   WHERE ep.row_identifier = 1;
    
           PID EQUIPMENTID      PRICE
    ---------- ----------- ----------
             4           1         20
             2           2         20
             6           3         10
    
    SQL>
    

    例如,获取每个部门最低工资的员工详细信息-

    SQL> WITH DATA AS
      2    ( SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptno
      3    )
      4  SELECT * FROM emp A, DATA b
      5  WHERE A.deptno = b.deptno
      6  AND A.sal = b.min_sal
      7  /
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO     DEPTNO    MIN_SAL
    ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 17-DEC-80        800                    20         20     800
          7900 JAMES      CLERK           7698 03-DEC-81        950                    30         30     950
          7934 MILLER     CLERK           7782 23-JAN-82       1300                    10         10       1300
    

    您还可以使用 ROW_NUMBER 等分析函数。

    SQL> WITH DATA AS
      2    ( SELECT t.*, row_number() OVER(ORDER BY sal) rn FROM emp t
      3    )
      4  SELECT * FROM emp WHERE empno =
      5    (SELECT empno FROM data WHERE rn = 1
      6    )
      7  /
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 17-DEC-80        800                    20
    
    SQL>
    

    没有 CTE:

    SELECT E.* 
    FROM Equip_price E
    INNER JOIN (
                  SELECT ep.equipmentID, min(ep.price) minprice
                   FROM Equip_price ep
                  GROUP BY ep.equipmentID
                ) aggr
    ON (E.equipmentID = aggr.equipmentID AND E.price = aggr.minprice)
    

    SELECT ep.id,
           ep.equipmentID,
           ep.price
     FROM (
           SELECT ep.*,
                  row_number() OVER(PARTITION BY ep.equipmentID ORDER BY ep.price)
                    AS row_identifier
           FROM Equip_price ep
          ) ep
     WHERE ep.row_identifier = 1;
    

    【讨论】:

    • 我认为第一个解决方案行不通,因为我有重复的sal 详细信息。
    • 没错,正如我所说,您需要确定子查询是否返回多行。寻求第二个解决方案。或使用IN
    • 请在此处举例说明如何使用IN
    • WHERE sal in (SELECT MIN(sal) FROM emp)
    • 对不起,我想修改我的sql。其实我想要min 价格group by equipid。在你的例子中说minsal group by dept_id。请帮助通过某个值找到分组的最小值
    【解决方案2】:

    试试这个:

    select min(x.pid) as min_pid, x.equipmentID, y.min_price
    from Equip_price x
    inner join
    (
        select equipmentID, min(price) as min_price
        from Equip_price
        group by equipmentID
    ) y on y.equipmentID = x.equipmentID and y.min_price = x.price
    group by x.equipmentID, y.min_price
    order by 2;
    

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2019-08-05
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多