Mysql sql:按多个相关字段(日期、工作日、月份)分组
我正在处理一个SQL任务。目标是从flights表中了解给定月份中给定日期的平均航班数 输入表: 飞行 flights表的一个示例。同一日期可能有多个条目Mysql sql:按多个相关字段(日期、工作日、月份)分组,mysql,group-by,Mysql,Group By,我正在处理一个SQL任务。目标是从flights表中了解给定月份中给定日期的平均航班数 输入表: 飞行 flights表的一个示例。同一日期可能有多个条目 id dep_day_of_week dep_month dep_date 1 Thursday January 4/7/2005 15:24:00 2 Friday February 5/6/2005 12:12:12 3 Friday Februar
id dep_day_of_week dep_month dep_date
1 Thursday January 4/7/2005 15:24:00
2 Friday February 5/6/2005 12:12:12
3 Friday February 5/6/2005 15:12:12
我阅读了如下解决方案:
SELECT a.dep_month,
a.dep_day_of_week,
AVG(a.flight_count) AS average_flights
FROM (
SELECT dep_month, dep_day_of_week, dep_date,
COUNT(*) AS flight_count
FROM flights
GROUP BY 1,2,3
) a
GROUP BY 1,2
ORDER BY 1,2;
我的问题在子查询中,该子查询计算每天的航班数:
SELECT dep_month, dep_day_of_week, dep_date, COUNT(*) AS flight_count
FROM flights
GROUP BY 1,2,3
由于dep_月、dep_日、dep_周、dep_日期是三个相关属性,其中dep_日期可能是三个属性中最详细的解决方案。所以我想,groupby1,2,3
将执行与groupby3
相同的功能
为了检查可能存在的差异,我使用..中的count(*)。要选择上述子查询产生的所有术语
Select count(*) from (
SELECT dep_month, dep_day_of_week, dep_date, COUNT(*) AS flight_count
FROM flights
GROUP BY 1,2,3 or Group Group by 3)
在输出中,groupby 1,2,3
和groupby 3
的计数分别为447和441。为什么这两种分组方法有什么不同
更新:
感谢@trincot的出色回答。我使用了他建议的代码,发现输入数据库不一致
SELECT dep_date, count(distinct dep_month), count(distinct dep_day_of_week)
FROM flights
GROUP BY dep_date
HAVING count(distinct dep_month) > 1
OR count(distinct dep_day_of_week) > 1
输出:
dep_date count(distinct dep_month) count(distinct dep_day_of_week)
1/16/2001 1 2
10/25/2003 1 2
2/23/2000 1 2
3/29/2001 1 2
4/3/2001 1 2
5/13/2000 1 2
具体来说,数据库为1/16/2001 8:25:00
指定星期一,为1/16/2001 7:56:00
指定星期二。这就是不一致的原因。由于日期字段有一个时间组件,子查询中的计数(*)
每次都将为1,因为时间组件将不同并生成一个新组。您的组实际上是每秒
您可以在不使用子查询的情况下获得结果,如下所示:
select dep_month,
dep_day_of_week,
count(*) /
count(distinct substring_index(dep_date, ' ', 1)) avg_flights
from flights
group by dep_month,
dep_day_of_week
这将统计所有航班记录,并将其除以这些航班的不同日期数。仅提取空间前的零件即可提取日期
请注意,这意味着当你在某一天没有任何记录时,这一天将不计入平均数,可能会给人一种错误的印象。例如,如果一月份只有一个星期五有航班(比如说10个),但是一月份有4个星期五,你仍然会得到平均10个,即使2.5个更合理
关于计数的差异
您声明此查询返回447条记录:
Select count(*) from (
SELECT dep_month, dep_day_of_week, dep_date, COUNT(*) AS flight_count
FROM flights
GROUP BY 1,2,3)
而这仅仅是441:
Select count(*) from (
SELECT dep_month, dep_day_of_week, dep_date, COUNT(*) AS flight_count
FROM flights
GROUP BY 3)
这似乎表明您在多个记录中有相同的日期,但在前两列中有一列存在差异,这将是不一致的。您可以通过此查询找到:
SELECT dep_date, count(distinct dep_month), count(distinct dep_day_of_week)
FROM flights
GROUP BY dep_date
HAVING count(distinct dep_month) > 1
OR count(distinct dep_day_of_week) > 1
在正常数据集中,此查询应返回0条记录。如果它返回记录,您将得到至少一条记录中未正确设置月份的日期,或者至少一条记录中未正确设置星期几。dep_date的数据类型是什么<代码>日期/时间戳
?你能分享一个sql提琴吗?请同时检查同一日期是否有多个条目。检查SELECT dep_date,COUNT(*)total FROM flight_COUNT GROUP BY dep_date,COUNT(*)大于1
显然同一日期有多个条目,这就是为什么会发生计数。text
对于日期来说是一种非常糟糕的格式选择。“但是当我使用COUNT(*)FROM
时……”:您能否更具体一点,提供这些SQL语句?谢谢您的建议。但是,不应该按dep_月、dep_日、dep_周、dep_日期分组以每秒为基础,而按dep_日期分组也以每秒为基础吗?我在回答中添加了一部分。我明白了。所以从理论上讲,两者应该返回相同的结果。但由于数据库中存在不一致/错误,因此存在差异。我现在找到虫子了!非常感谢!
SELECT dep_date, count(distinct dep_month), count(distinct dep_day_of_week)
FROM flights
GROUP BY dep_date
HAVING count(distinct dep_month) > 1
OR count(distinct dep_day_of_week) > 1