我在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
现在有人怎么做?
答案 0 :(得分:0)
为避免混淆,我将列名称更改为:
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 :(得分: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_id
是NOT NULL
)。参见: