2018年火警电话最多周数查询SQL结果不符,排查错误原因
问题:2018年火警电话最多周统计结果不一致原因分析
需求说明
找出2018年一年中火警电话数量最多的周(注:本人误将日期的日(dd)当作周)。自己编写的SQL与讲师提供的SQL预期结果应一致,但实际结果不同,需排查错误原因。
本人使用的SQL语句
select to_char(CallDate,"dd") week ,count(to_char(CallDate,"dd")) as count from demo_db.fire_service_calls_tbl where to_char(CallDate,"yyyy") = "2018" group by week order by count desc
讲师使用的SQL语句
select weekofyear(to_date(CallDate,"MM/dd/yyyy")) week_year, count(*) as count from demo_db.fire_service_calls_tbl where year(to_date(CallDate,"yyyy")) == 2018 group by week_year order by count desc
数据读取代码
fire_df = spark.read \ .format("csv") \ .option("header", "true") \ .option("inferSchema", "true") \ .load("/databricks-datasets/learning-spark-v2/sf-fire/sf-fire-calls.csv")
错误原因分析
核心逻辑错误:分组维度完全不符
你写的SQL里,to_char(CallDate,"dd")提取的是日期中的「日」(取值1-31),相当于把所有当月1号的记录归为一组,当月2号的归为另一组……这是按每月的日期统计,和需求里的「按周统计」完全不是同一个维度,结果自然和讲师的SQL差异极大。讲师SQL的正确逻辑
讲师的SQL用weekofyear(to_date(CallDate,"MM/dd/yyyy"))提取的是一年中的周数(取值1-53),分组维度是正确的「周」,统计的是每一周的火警电话总数,完全符合需求逻辑。补充:讲师SQL的小语法问题
讲师SQL的where子句里year(to_date(CallDate,"yyyy")) == 2018存在两处问题:一是Spark SQL中判断相等用=而非==;二是日期转换格式"yyyy"不正确,应该和前面to_date的格式"MM/dd/yyyy"保持一致,正确写法应为year(to_date(CallDate,"MM/dd/yyyy")) = 2018,不过这不是导致你俩结果不一致的核心原因,核心还是你的分组维度错误。
内容的提问来源于stack exchange,提问作者Salim muneer lala
相关产品推荐
相关产品推荐

