Presto SQL日期解析报错 date与varchar类型无法对比求助
报错根因
- 类型不匹配触发执行错误:Presto为强类型计算引擎,不支持隐式类型转换下的跨类型相等判断。你写的CASE WHEN条件中,等号左侧
TO_DATE(year_month, '%Y-%m')返回date类型,等号右侧date_format(...)返回varchar类型,二者类型不一致直接导致报错。 - 业务逻辑存在缺陷:即便修复类型问题,当前写法也无法得到正确结果。你的SQL按
branch + year_month分组,每个结果分组仅包含当前分支当月的聚合数据,没有关联上月的聚合结果,CASE逻辑不可能匹配到上月的计数。
正确实现方式
先聚合得到每个分支每个月的sellid计数,再通过LAG窗口函数,按分支分区、按年月排序,取上一个月的聚合值即可,参考SQL如下:
WITH month_agg AS ( SELECT branch, year_month, COUNT(sellid) AS current_month_count FROM your_view GROUP BY branch, year_month ) SELECT branch, year_month, current_month_count AS "count(sellid) actual month", LAG(current_month_count, 1) OVER ( PARTITION BY branch ORDER BY year_month ) AS "count(sellid) last month" FROM month_agg ORDER BY branch, year_month;
补充说明:你的
year_month字段为yyyy-MM格式的字符串,其字典序和自然时间顺序完全一致,直接用该字段排序不会出现时序错乱问题,无需额外转日期处理。如果你的数据存在月份缺失(比如某分支跳过某自然月无数据),上述写法会取到最近一个有数据月份的计数;如果需要严格匹配上一自然月(缺失月显示为null),可以先生成包含全部分支、全部连续年月的日历维表,左关联你的原始数据补全缺失月份后,再做聚合和窗口计算。
内容的提问来源于stack exchange,提问作者Marcos Micheloni
相关产品推荐
相关产品推荐

