HiveSQL小练习--求连续消费的天数

数据格式:
1 2019-02-08 6214.23
1 2019-02-08 6247.32
1 2019-02-09 85.63
1 2019-02-09 967.36
1 2019-02-10 85.69
1 2019-02-12 769.85
1 2019-02-13 943.86
1 2019-02-14 538.42
1 2019-02-15 369.76
1 2019-02-16 369.76
1 2019-02-18 795.15
1 2019-02-19 715.65
1 2019-02-21 537.71
2 2019-02-08 6214.23
2 2019-02-08 6247.32
2 2019-02-09 85.63
2 2019-02-09 967.36
2 2019-02-10 85.69
2 2019-02-12 769.85
2 2019-02-13 943.86
2 2019-02-14 943.18
2 2019-02-15 369.76
2 2019-02-18 795.15
2 2019-02-19 715.65
2 2019-02-21 537.71
3 2019-02-08 6214.23
3 2019-02-08 6247.32
3 2019-02-09 85.63
3 2019-02-09 967.36
3 2019-02-10 85.69
3 2019-02-12 769.85
3 2019-02-13 943.86
3 2019-02-14 276.81
3 2019-02-15 369.76
3 2019-02-16 369.76
3 2019-02-18 795.15
3 2019-02-19 715.65
3 2019-02-21 537.71

建表语句:
create table deal_tb(
id string
,datestr string
,amount string
)row format delimited fields terminated by ‘,’;

需求以及结果样式
需求:比如原数据中8号、9号、10号都进行了消费,就算做是连续消费,算是一组数据,但11号没有消费,12号进行了消费,那十二号之后的连续消费算作下一组
在这里插入图片描述
答案:
1.先是按照id号和日期进行分组,在对消费做一个求和
select id,datestr,sum(amount) as sum_amount
from deal_tb
group by id,datestr

2.按照id号分组,日期排序打上一个标签
select t1.id
,t1.datestr
,t1.sum_amount
,row_number() over(partition by id order by datestr) as rn
from(
select id
,datestr
,sum(amount) as sum_amount
from deal_tb
group by id,datestr
) t1
在这里插入图片描述

3.拿前面的时间减去后面的标签,连续消费的记录就会被标记到一起,都是一样的,就是一个区
select tt1.id
,tt1.datestr
,tt1.sum_amount
,date_sub(tt1.datestr,rn) as grp
from(
select t1.id
,t1.datestr
,t1.sum_amount
,row_number() over(partition by id order by datestr) as rn
from(
select id
,datestr
,sum(amount) as sum_amount
from deal_tb
group by id,datestr
) t1
) tt1
在这里插入图片描述

4.加上连续消费的天数,以及连续消费了哪几天
select ttt1.id
,ttt1.grp
,round(sum(ttt1.sum_amount),2) as sc_sum_amount
,count(1) as sc_days
,min(ttt1.datestr) as sc_start_date
,max(ttt1.datestr) as sc_end_date
from(
select tt1.id
,tt1.datestr
,tt1.sum_amount
,date_sub(tt1.datestr,rn) as grp
from(
select t1.id
,t1.datestr
,t1.sum_amount
,row_number() over(partition by id order by datestr) as rn
from(
select id
,datestr
,sum(amount) as sum_amount
from deal_tb
group by id,datestr
) t1
) tt1
) ttt1
group by ttt1.id,ttt1.grp;
在这里插入图片描述

感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是练习-java多路分支之月份天数计算的回复: 这个练习是要我们编写一个Java程序,根据用户输入的月份,计算出该月份有多少天。我们可以使用多路分支语句(if-else或switch-case)来实现这个功能。具体实现方法可以参考以下代码: ``` import java.util.Scanner; public class MonthDays { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入月份:"); int month = input.nextInt(); int days = ; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: System.out.print("请输入年份:"); int year = input.nextInt(); if ((year % 4 == && year % 100 != ) || year % 400 == ) { days = 29; } else { days = 28; } break; default: System.out.println("输入的月份不正确!"); break; } if (days != ) { System.out.println(month + "月份有" + days + "天。"); } } } ``` 以上代码中,我们首先使用Scanner类获取用户输入的月份,然后使用switch-case语句根据月份计算出该月份有多少天。在计算2月份天数时,我们还需要根据用户输入的年份来判断是否为闰年。最后,我们输出计算结果,如果用户输入的月份不正确,则输出提示信息。 希望这个回复能够帮助到您,如果还有其他问题,请随时联系我。 ### 回答2: Java多路分支是Java编程中的一个重要部分,它通常用于判断某个条件或变量的值,然后执行相应的操作。在本文中,我们将介绍如何使用Java多路分支计算每个月的天数。 Java多路分支的基本语法是:if (条件) {执行语句块1} else if (条件2) {执行语句块2} else {执行语句块3}。使用这种语法,我们可以根据条件执行不同的操作。 对于月份天数计算,我们需要知道每个月的天数。通常,1月、3月、5月、7月、8月、10月和12月都有31天;4月、6月、9月和11月都有30天;2月有28或29天,具体取决于是否为闰年。 我们可以使用Java多路分支来计算每个月的天数。我们可以使用一个int变量来表示月份,并根据1到12的不同值分别执行操作。我们可以使用一个switch语句来实现这个过程。 具体实现方法如下: 1. 定义一个int变量表示月份,例如int month = 5; 2. 使用switch语句根据月份计算天数,例如: switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println("该月共有31天"); break; case 4: case 6: case 9: case 11: System.out.println("该月共有30天"); break; case 2: System.out.println("输入年份:"); Scanner sc = new Scanner(System.in); int year = sc.nextInt(); if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { System.out.println("该月共有29天"); } else { System.out.println("该月共有28天"); } break; default: System.out.println("输入月份不合法"); break; } 在上述代码中,我们首先使用switch语句根据月份进行判断,然后根据不同的月份计算出天数。对于2月份,我们需要使用Scanner类来获取用户输入的年份,然后判断是否为闰年,从而计算出2月的天数。 在实际编写Java代码时,我们需要注意一些细节。例如,在使用Scanner类时,我们需要先导入java.util.Scanner类;在使用switch语句时,我们需要添加break语句来跳出当前的case块。 总之,练习Java多路分支之月份天数计算是一项基础而重要的练习。熟练掌握Java多路分支的使用方法,可以使我们更加高效地编写Java程序。 ### 回答3: 月份天数计算是Java多路分支的一个经典练习,通过这个练习可以加深对Java多路分支语句的理解。下面我将介绍Java多路分支语句的概念以及如何实现月份天数计算。 Java多路分支语句 Java多路分支语句指的是在程序执行时,需要根据不同的条件执行不同的程序段的语句。Java中多路分支语句有两种:switch语句和if-else语句。switch语句比if-else语句更清晰简洁,特别是当条件分支比较多时。switch语句的一般形式如下: ``` switch (expression) { case value1: // 语句块1 break; case value2: // 语句块2 break; case value3: // 语句块3 break; default: // 默认的语句块 break; } ``` 多路分支语句的实现原理是,程序先计算表达式的值,然后根据表达式的值跳转到指定的语句块。如果表达式的值与任何一个case的值相同,则执行相应的语句块,如果没有相同的值,则执行默认的语句块。 月份天数计算 对于月份天数计算,我们需要根据输入的月份判断该月份有多少天。一年中月份的天数有两种情况:30天或31天,二月份则为28天或29天。因此,我们需要设计一个程序来判断输入月份具体是多少天。 下面是用Java多路分支实现月份天数计算的代码: ``` import java.util.Scanner; public class MonthDays { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入月份:"); int month = input.nextInt(); int days = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: System.out.print("请输入年份:"); int year = input.nextInt(); if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { days = 29; } else { days = 28; } break; default: System.out.print("月份输入错误!"); } if (days != 0) { System.out.println(month + "月份有" + days + "天!"); } } } ``` 上述代码中,我们使用switch语句来判断月份的天数,如果月份在1、3、5、7、8、10、12这七个月中,那么该月份有31天,如果在4、6、9、11这四个月中,那么该月份有30天。对于2月份来说,需要再输入年份,然后根据闰年和平年计算出该月份的天数。如果输入的不是1-12的整数,则提示月份输入错误。 总结 通过这个练习,我们不仅加深了对Java多路分支语句的理解,还学习了如何根据特定条件计算天数。在实际工作中,多路分支语句也常常用于判断不同的条件,进而执行不同的程序段,它在控制程序流程、提高代码的可读性上有很大的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊帅和和。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值