计算postgresql中的最大值

时间:2018-07-01 06:33:01

标签: postgresql count max

我在postgresql中提出一个sql问题时遇到问题,希望在这里获得帮助

我有三张桌子,分别是员工,访客和来访者。我想找出哪些员工(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

现在有人怎么做?

enter image description here

2 个答案:

答案 0 :(得分:0)

为避免混淆,我将列名称更改为:

  • visitor表中,FK to employee idemployee_in_charge_id
  • visit表中,FK to employee idemployee_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_idvisit表的一部分而不是visitor表的一部分,这听起来更正确。我的假设是每个visit都有1名员工(A)负责处理访问,而访客正在与1名员工(B)会面。因此,一位访客可以进行多次访问,由不同的员工处理。

无论如何,以上我的答案是基于您的原始架构设计的。

答案 1 :(得分:0)

假设采用标准的n:m实施方式,例如详细的here,那么这可能是实现该目标的一种方式:

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_idNOT NULL)。参见: