считать максимальные значения в postgresql - PullRequest
0 голосов
/ 01 июля 2018

У меня проблема с формулировкой вопроса sql в postgresql, в надежде получить помощь здесь

У меня есть три сотрудника, посетитель и визит. Я хочу узнать, какой сотрудник (fk_employee_id), который был ответственным за большинство посещений, которые не были проверены.

Я хочу задать вопрос sql, который возвращает только результат номер один (возможно, функцией max?) Вместо моего текущего, который возвращает ранжированный список (этот ранжированный список также не работает, если число одну должность делят два человека)

Это мой текущий вопрос sql:

select visitor.fk_employee_id, count(visitor.fk_employee_id)

From Visit

Inner Join visitor on visit.fk_visitor_id = visitor.visitor_id
WHERE check_out_time IS NULL

group by visitor.fk_employee_id, visitor.fk_employee_id
Limit 1

Кто-нибудь сейчас, как это сделать?

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Предполагая стандартную реализацию n: m, как подробно здесь , это может быть одним из способов сделать это:

SELECT fk_employee_id
FROM   visit
WHERE  check_out_time IS NULL
GROUP  BY fk_employee_id
ORDER  BY count(*) DESC
LIMIT  1;

При условии ссылочной целостности вам вообще не нужно включать в запрос таблицу visitor.

count (*) немного быстрее, чем count(fk_employee_id), делающий то же самое в этом случае. (при условии fk_employee_id равно NOT NULL). См:

0 голосов
/ 01 июля 2018

Чтобы избежать путаницы, я изменю имена столбцов на:

  • visitor стол, FK to employee id: employee_in_charge_id
  • visit таблица, FK to employee id: employee_to_meet_id

Из вашего объяснения в комментариях вы ищете Сотрудника , который имеет большинство посещений , которые не проверены .

В случае, когда более 1 сотрудника имеют одинаковое максимальное количество посещений, которые не являются выездными, этот запрос перечисляет всех нескольких сотрудников:

SELECT * FROM 
(
    SELECT
        r.employee_in_charge_id,
        count(*) cnt,
        rank() over (ORDER BY count(*) DESC)
    FROM visit v
        JOIN visitor r ON v.visitor_id = r.id
    WHERE v.check_out_time IS NULL
    GROUP BY r.employee_in_charge_id
) a

WHERE rank = 1;

Ссылка SQLFidle ссылка: http://sqlfiddle.com/#!17/423d9/2

Примечание:

Для меня это звучит более правильно, если employee_in_charge_id является частью таблицы visit, а не visitor таблицы. Я предполагаю, что для каждого visit есть 1 сотрудник (A), который отвечает за посещение, а посетитель встречает 1 сотрудника (B). Таким образом, 1 посетитель может совершить несколько посещений, которые обрабатываются разными сотрудниками.

В любом случае, мой ответ выше основан на вашей оригинальной схеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...