选择其他列值以及min(薪水),其中可以有重复的薪水

时间:2018-03-14 11:57:17

标签: sql oracle oracle11g

我在Oracle数据库中有以下架构和数据。

CREATE TABLE people ( 
  person_id   INTEGER NOT NULL PRIMARY KEY, 
  title       VARCHAR2(20), 
  salary  INT 
);

INSERT INTO people (person_id, title, salary) 
  WITH names AS ( 
    SELECT 4, 'Prof', 5    FROM dual UNION ALL 
    SELECT 5, 'Prof', 6   FROM dual UNION ALL 
    SELECT 6, 'Dr',7 FROM dual UNION ALL 
    SELECT 7, 'Dr',7     FROM dual 
  ) 
  SELECT * FROM names;



  select * from people;

我想通过标题和收入金额获得收入最少的人的身份。如果有两个收入最少的人,我只想要其中一个。以下是我想要的结果。

Id title Salary
4 Prof 5
6 Dr   7

第二行也可以是7 Dr 7,因为两位博士的收入都相同。 我使用self joins检查了解决方案,但它不适合我的情况,可以有两个Drs获得相同的金额。

我正在使用oracle,并怀疑FIRST函数可以帮助我吗?但我无法找到一个可以让我理解的地方。

提供可用数据here

2 个答案:

答案 0 :(得分:1)

WITH T AS
  (SELECT person_id,
          title,
          salary,
          ROW_NUMBER() OVER (PARTITION BY title
                             ORDER BY salary,
                                      person_id) minsalary
   FROM people)
SELECT person_id,
       title,
       salary
FROM T
WHERE minsalary = 1
ORDER BY 1

Fiddle

答案 1 :(得分:1)

您可以使用FIRST聚合函数。

有关详细说明,请参阅FIRST

SELECT MIN(person_id) KEEP (
        DENSE_RANK FIRST ORDER BY salary
        ) AS id
    ,title
    ,MIN(salary) AS salary
FROM people
GROUP BY title
ORDER BY id;

Fiddle