簡體   English   中英

在Oracle中選擇最小值行

[英]Select Min value row in oracle

我要選擇具有min price的整row 因為我需要更多列的數據才能顯示具有最低價格的數據。 像下面這樣。

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

我該如何使用Oracle DB?


更新

我實際上是想通過equipment_id獲得equipment_price。 以下是樣本數據。

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

嘗試這個:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM