PostgreSQL найти минимум - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть 2 таблицы:

eomployee:

e_id  | firstname | lastname  
-------+-----------+-----------
 10100 | Mark      | Stevens
 10101 | Alex      | Watts
 10102 | Hannah    | Burton

и works_on:

employee_e_id | product_prod_nr | hours 
---------------+-----------------+-------
         10100 | 66000           |    40
         10100 | 77211           |    37
         10101 | 90210           |    67

Теперь я хочу получить e_id, имя, фамилию, часычеловека, который работает меньше всего часов.Это просто пример данных из 2 таблиц.Я пытался получить его с пределом 1, но это не работает, когда у меня 2 человека, например, работают 1 час.

Ответы [ 4 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать оконные функции:

SELECT e_Id, firstname, lastname, hours
FROM (SELECT e.*,
             MIN(hours) OVER () as min_hours
      FROM eomployee e JOIN
           works_on w
           ON e.e_id = w.employee_e_id
     ) ew
WHERE hours = min_hours;
0 голосов
/ 18 декабря 2018

Если вы хотите, чтобы строка с наименьшим количеством часов (= 37 в вашем примере):

SELECT
    e.e_id,
    e.firstname,
    e.lastname,
    w.hours
FROM 
    eomployee e 
JOIN works_on w ON e.e_id = w.employee_e_id
ORDER BY w.hours
LIMIT 1

Если вы хотите получить строку для совокупного рабочего времени (в вашем примере «10100» работает 37+ 40 = 77 часов):

SELECT
    e_Id, firstname, lastname, hours
FROM (
    SELECT
        e.e_id,
        e.firstname,
        e.lastname,
        w.hours,
        SUM(hours) OVER (PARTITION BY e_id) as cum
    FROM 
        eomployee e 
    JOIN works_on w ON e.e_id = w.employee_e_id
) s
ORDER BY cum
LIMIT 1

демо: db <> скрипка

0 голосов
/ 18 декабря 2018

Попробуйте это:

SELECT e.*,
       max_hours_row.*
FROM eomployee e
INNER JOIN
  (SELECT employee_e_id,
          MIN(hours) AS time_min
   FROM works_on
   GROUP BY employee_e_id ) AS max_hours_row ON max_hours_row.employee_e_id = e.e_id
0 голосов
/ 18 декабря 2018

попробуйте, как показано ниже, используя оконную функцию

with cte as
(
select e.e_id,
e.firstname,e.lastname,w.hours,row_number() over(order by w.hours asc) rn
from eomployee e join works_on w on e.e_id=w.employee_e_id
) select * from cte where rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...