hive sql中between and

捣鼓了一下午,发现被复制结果集坑了。

哎感觉踩坑踩的像个无知的新手

select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues
from dcs.NT_TP_P_CUSTOMERS a 
left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key
where SUBSTRING(a.CREATED_TIME,1,7)>='2018-01' and SUBSTRING(a.CREATED_TIME,1,7)<= '2018-04'
group by SUBSTRING(a.CREATED_TIME,0,7),dict_value
order by clues desc

这两种写法的结果是完全一致的。

select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues
from dcs.NT_TP_P_CUSTOMERS a 
left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key
where SUBSTRING(a.CREATED_TIME,1,7) in ('2018-01','2018-02','2018-03','2018-04')
group by SUBSTRING(a.CREATED_TIME,0,7),dict_value
order by clues desc

但我不用in,单独使用筛选条件2018-01,2018-02,2018-03,2018-04然后将四份结果拼起来,发现大于between and的结果值。反复查才发现自己是掉到复制结果集的坑里了。结果集最多200行,所以全选复制后,就出错了。

👏👏👏再看看我们以前的文章😃😃😃
🌺 Excel中数据分析工具库-相关系数篇
🌺 干货,手把手教会你做相关性分析
🌺 5年数据分析路,小结。
🌺 用户细分及画像分析
🌺 K-近邻算法及实践

欢迎关注,微信公众号“数据分析师之家
扫描二维码 关注我们
💁提供职业规划、简历指导、面试辅导服务哦
QQ交流群:254674155
在这里插入图片描述

数据分析之家联合JEE RAY品牌为粉丝派发福利

在这里插入图片描述
添加粉丝福利派发官,领取粉丝福利哦

<think>嗯,用户想知道Hive SQL中开窗函数ROWS BETWEEN的用法,需要示例和语法说明。首先我得回忆一下Hive的开窗函数相关知识,特别是窗口子句的部分。 ROWS BETWEEN应该用于定义窗口的框架范围,也就是在分区内确定当前行的计算范围。常见的用法比如计算移动平均、累计求和等。语法结构应该是在OVER子句中使用ROWS BETWEEN来指定起始和结束位置。 比如,用户可能想了解如何指定当前行之前的若干行,或者之后的行,比如UNBOUNDED PRECEDING表示分区的开始,CURRENT ROW是当前行,UNBOUNDED FOLLOWING是分区的结尾。还有像n PRECEDING和n FOLLOWING这样的相对位置。 接下来需要给出具体的示例,比如按日期排序,计算最近三天的销售额平均,这时候就需要ROWS BETWEEN 2 PRECEDING AND CURRENT ROW。或者累计求和的话,用ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。 还要注意和RANGE BETWEEN的区别,ROWS是物理行,RANGE是逻辑值范围。这部分可能需要简单提一下,避免用户混淆。 另外,用户提供的引用里提到了Hive的开窗函数如SUM、RANK、ROW_NUMBER等,所以可以结合这些函数来举例。例如,用SUM配合ROWS BETWEEN来做累计求和,或者AVG计算移动平均。 需要注意语法是否正确,比如OVER子句中的PARTITION BY和ORDER BY的位置,以及ROWS BETWEEN的位置是否正确。比如示例中的写法是否符合Hive SQL的标准。 可能还需要提醒用户在使用时注意性能问题,因为窗口函数在处理大数据时可能会有性能影响,尤其是在没有适当分区的情况下。 最后,生成相关问题的时候,可以考虑窗口函数的其他子句、与GROUP BY的区别、性能优化,以及不同函数的结合使用等。</think>### Hive SQL开窗函数ROWS BETWEEN用法说明 #### 一、语法结构 在Hive SQL中,`ROWS BETWEEN`用于定义窗口函数的作用范围,需配合`OVER()`子句使用: ```sql 窗口函数() OVER ( PARTITION BY 列1, 列2... ORDER BY 排序列 ROWS BETWEEN 起始位置 AND 结束位置 ) ``` **核心参数说明**: - **UNBOUNDED PRECEDING**:窗口起点为分区第一行 - **n PRECEDING**:当前行前n行 - **CURRENT ROW**:当前行 - **n FOLLOWING**:当前行后n行 - **UNBOUNDED FOLLOWING**:窗口终点为分区最后一行 #### 二、使用示例 1. **移动平均计算**(近3天销售额平均) ```sql SELECT order_date, sales, AVG(sales) OVER ( PARTITION BY product_id ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS moving_avg FROM sales_table ``` 2. **累计求和**(从首行到当前行累计) ```sql SELECT employee_id, month, salary, SUM(salary) OVER ( PARTITION BY employee_id ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_sum FROM salary_table ``` 3. **前后范围统计**(当前行前后各1行) ```sql SELECT time, value, MAX(value) OVER ( ORDER BY time ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS neighbor_max FROM sensor_data ``` #### 三、与RANGE BETWEEN的区别 | 类型 | 计算方式 | 适用场景 | |------------|--------------------------|------------------------------| | ROWS | 按物理行数划分 | 明确行数的窗口(如移动平均)| | RANGE | 按数值范围划分 | 按数值区间划分(如时间范围)| #### 四、注意事项 1. 必须指定`ORDER BY`才能使用`ROWS BETWEEN` 2. 窗口范围定义会影响计算结果准确性 3. 大数据量场景需注意分区字段选择[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值