簡體   English   中英

在對一列(或一組列)A進行分組時,如何獲得A組中每列(或一組列)B中最常見的值?

[英]When grouping on a column (or set of columns) A, how to get the most common value of a column (or set of columns) B in each group of 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的了解很少。

做這種事情的一般方法是從較簡單的關系建立所需的復雜關系。 您可以將查詢視為表,然后將其重新分組,或將其聯接到表或其他查詢。 讓我們先做公司。

這樣可以獲取每個日期和時間每個公司的員工人數:

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;

這樣可以使您在每個日期和時間內擁有任何一家公司最多的員工人數(但丟失分組依據的公司名稱):

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;

完成上述規定后,您應該可以

  • 將整個事物連接到您的原始查詢(該查詢具有每個日期和時間的總數),並且
  • 針對員工類型再次執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM