[英]MySQL: Select Last Max() Value of One Group But Summarize by Another Group
我正在尝试使用此数据集按雇员和QA_Score的Date_Time的最后值列出Company_Name:
+--------------+-----------+------------------+-----------+----------+
| Company_Name | Wing_Name | Date_Time | Employees | QA_Score |
+--------------+-----------+------------------+-----------+----------+
| Company A | Wing A | 06/08/2018 13:00 | 82 | 3.5 |
| Company A | Wing A | 06/08/2018 13:01 | 83 | 3.6 |
| Company A | Wing A | 06/08/2018 13:02 | 84 | 3.7 |
| Company B | Wing A | 06/08/2018 14:00 | 82 | 3.6 |
| Company B | Wing A | 06/08/2018 14:01 | 85 | 3.7 |
| Company B | Wing A | 06/08/2018 14:02 | 88 | 3.8 |
+--------------+-----------+------------------+-----------+----------+
所需的输出应为:
+--------------+-----------+----------+
| Company_Name | Employees | QA_Score |
+--------------+-----------+----------+
| Company A | 84 | 3.7 |
| Company B | 88 | 3.8 |
+--------------+-----------+----------+
我已经成功地使用以下代码显示了Wing_Name的Date_Time的最后结果,但是我一生都无法为Company_Name找出它,而将Wing_Name排除在输出之外。
SELECT * FROM table
WHERE (Wing_Name, Date_Time) IN
(SELECT Wing_Name, MAX(Date_Time) Date_Time FROM table GROUP BY Wing_Name)
AND `Company_Name` = "Company A";
这一定是我想念的简单事情吗? 先感谢您。
编辑:
我相信我可能没有正确地问过我的问题,并且出于Wing_Name和输出意图的目的,已经改进了数据集列表以提供更多颜色:
+--------------+-----------+------------------+-----------+----------+
| Company_Name | Wing_Name | Date_Time | Employees | QA_Score |
+--------------+-----------+------------------+-----------+----------+
| Company A | Wing A | 06/08/2018 13:00 | 82 | 3.5 |
| Company A | Wing A | 06/08/2018 13:01 | 83 | 3.6 |
| Company A | Wing A | 06/08/2018 13:02 | 84 | 3.7 |
| Company A | Wing B | 06/08/2018 13:00 | 50 | 4.1 |
| Company A | Wing B | 06/08/2018 13:01 | 51 | 4.2 |
| Company A | Wing B | 06/08/2018 13:02 | 52 | 4.3 |
| Company B | Wing A | 06/08/2018 14:00 | 82 | 3.6 |
| Company B | Wing A | 06/08/2018 14:01 | 85 | 3.7 |
| Company B | Wing A | 06/08/2018 14:02 | 88 | 3.8 |
+--------------+-----------+------------------+-----------+----------+
通过此编辑,现在期望的输出应该是每个Wing_name的结果的Company_Name雇员的总和,以及相应Wing_Name的QA_Score的平均值,但汇总在Company_Name下
使用上面的新修订数据集,所需的输出应为:
+--------------+-----------+----------+ | Company_Name | Employees | QA_Score | +--------------+-----------+----------+ | Company A | 136 | 4 | | Company B | 88 | 3.8 | +--------------+-----------+----------+
我想您只需要添加公司名称:
SELECT t.*
FROM table t
WHERE (Company_name, Wing_Name, Date_Time) IN
(SELECT CompanyName, Wing_Name, MAX(Date_Time) Date_Time
FROM table
GROUP BY Company_Name, Wing_Name
);
使用与现有sql类似的逻辑:
SELECT * FROM table
WHERE (Company_Name, Date_Time) IN
(SELECT Company_Name, MAX(Date_Time) Date_Time FROM table GROUP BY Company_Name);
或使用相关子查询:
SELECT *
FROM table t1
WHERE Date_Time = (SELECT Max(Date_Time) FROM Table WHERE t1.Company_Name = Company_Name);
或未解决的解决方案...
SELECT x.*
FROM my_table x
JOIN
( SELECT company_name
, wing_name
, MAX(date_time) dt
FROM my_table
GROUP
BY company_name
, wing_name
) y
ON y.company_name = x.company_name
AND y.wing_name = x.wing_name
AND y.dt = x.date_time;
您可以将子查询与GROUP BY
和SUM
和AVG
一起使用,请参见下面的代码,并且sqlfiddle示例已更新:
select Company_Name,sum(Employees),avg(QA_Score) from Table1 where (Company_Name,Date_Time)
in (
select Company_Name,Max(Date_Time) from Table1 group by Company_Name
)
group by Company_Name
这是一个sqlfiddle示例: https ://www.db-fiddle.com/f/27SuaGjL3SKfxhvqRRWUdd/3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.