![](/img/trans.png)
[英]How to use group by to get multiple result set? grouping on multiple columns
[英]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.