mysql - 在对一列(或一组列)A进行分组时,如何获取每组A中一列(或一组列)B的最常见值?

标签 mysql sql join inner-join grouping

我试图找出在任何给定时间建筑物中有多少用户。为此,我有两个表,

表a

Name    ENTER                  EXIT                       COMPANY    Employee
Jack    2013-01-01 01:00:00    2013-01-01 02:00:00        trilogy    Security Guard
Jane    2013-01-01 02:00:00    2013-01-01 03:00:00        trilogy    Security Guard
Judy    2013-01-03 01:00:00    2013-01-04 02:00:00        sindicate  Cleaner
Sam     2013-01-02 05:00:00    2013-01-02 08:00:00        lyop       Engineer

为了了解店内有多少人,我创建了另一个表,

表格n

a   b
1   2013-01-01 01:00:00
2   2013-01-01 02:00:00
3   2013-01-01 03:00:00
-
-
x   2013-01-05 23:00:00

然后我将它们加入到一起以查找在任何给定时间使用的总用户数

  SELECT DATE(n.b), HOUR(n.b), COUNT(*)
  FROM
  a INNER JOIN n ON n.b BETWEEN a.ENTER
  AND a.EXIT 
  GROUP BY 1, 2

结果 =

Date(n.b)    Hour(n.b)    Count(*)
2013-01-01   1            1
2013-01-01   2            2
2013-01-01   3            1
---
---
2013-01-02   5            1
so on....

这适用于我想要的。但是,现在我希望能够告诉顶级公司(无论员工类型)和顶级员工(无论公司)每小时占用建筑物的时间,以及更高的结果。

例如

 Date         Hour  Count(*)     Top-Company  Comp-Count   Top-Employe      Emp-Count 
 2013-01-01   01    1              Trilogy      1          Security Guard    1
 2013-01-01   02    2              Trilogy      2          Security Guard    2

如果可能的话,我想将其合并到我现有的查询中。我对 MySQL 知之甚少。

最佳答案

做这种事情的一般方法是从简单的关系中建立你需要的复杂关系。您可以像对待表一样对待查询并将其再次分组或将其连接到表或另一个查询。我们先做公司。

这会为您提供每个公司在每个日期和时间的员 worker 数:

select date(n.b) end_date, hour(n.b) end_hour, a.company, count(*) employees_present
from n, a
where n.b between a.enter and a.exit
group by 1, 2, 3;

这会让您获得任何一家公司在每个日期+时间拥有的最大员 worker 数(但会丢失分组依据中的公司名称):

select end_date, end_hour, max(employees_present) max_employees_present
from (
  select date(n.b) end_date, hour(n.b) end_hour, a.company, count(*) employees_present
  from n, a
  where n.b between a.enter and a.exit
  group by 1, 2, 3
) company_counts
group by 1, 2;

加入他们以取回公司名称:

select company_counts.end_date, company_counts.end_hour, company_counts.company
from
(
  select date(n.b) end_date, hour(n.b) end_hour, a.company, count(*) employees_present
  from n, a
  where n.b between a.enter and a.exit
  group by 1, 2, 3
) company_counts,
(
  select end_date, end_hour, max(employees_present) max_employees_present
  from (
    select date(n.b) end_date, hour(n.b) end_hour, a.company, count(*) employees_present
    from n, a
    where n.b between a.enter and a.exit
    group by 1, 2, 3
  ) company_counts_2
  group by 1, 2
) max_company_counts
where company_counts.end_date = max_company_counts.end_date and
  company_counts.end_hour = max_company_counts.end_hour and
  company_counts.employees_present = max_company_counts.max_employees_present;

完成上述内容后,您应该能够

  • 将整个事情加入到您的原始查询中(其中包含每个日期和时间的总计数),并且
  • 再为员工类型做一次。

关于mysql - 在对一列(或一组列)A进行分组时,如何获取每组A中一列(或一组列)B的最常见值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599765/

相关文章:

mysql - 使用查询确定变量的值 (MySQL)

适用于 Windows 7 64 位操作系统的 MYSQL 安装程序?

jquery - 我正在向服务器发出 Ajax 发布请求,所有数据都很好,但我的名字和姓氏正在更新为 "undefined"

MYSQL 优化 JOINED UNION SELECT 查询

sql - 计算表 1 中的实例并链接到表 2

SQL Server INSERT 触发器如何获取当前行的数据

mysql - 汇总mysql中的许多表

php - 选择加入mysql 2个数据库

php - 拉拉维尔 : to join 2 join OR order with null

mysql - 左外连接子查询