Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql:按多个相关字段(日期、工作日、月份)分组_Mysql_Group By - Fatal编程技术网

Mysql sql:按多个相关字段(日期、工作日、月份)分组

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

我正在处理一个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           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