Hive练习求给出2017年1月的新客数

已知一个表STG.ORDER,有如下字段:

Date,Order_id,User_id,amount

请给出sql进行统计:数据样例:

2017-01-01,10029028,1000003251,33.572017-01-02,10029028,1000003251,33.572017-01-03,10029028,1000003251,33.57
1)给出 2017年每个月的订单数、用户数、总成交金额。
2)给出201711月的新客数(指在11月才有第一笔订单)

建表

create table order_tab
(
    dt       string,
    order_id string,
    user_id  string,
    amount   decimal(10, 2)
) row format delimited fields terminated by ',';

1)给出 2017年每个月的订单数、用户数、总成交金额。

select date_format(dt, "yyyy-MM") `mon`,
       count(order_id),
       count(distinct (user_id)),
       sum(amount)
from order_tab
where  date_format(dt, 'yyyy')='2017'
group by date_format(dt, "yyyy-MM");

如下写法会报错,group by后面不能用上面的别名

select date_format(dt, "yyyy-MM") `mon`,
       count(order_id),
       count(distinct (user_id)),
       sum(amount)
from order_tab
where  date_format(dt, 'yyyy')='2017'
group by mon;
org.apache.hadoop.hive.ql.parse.SemanticException:
Line 7:9 Invalid table alias or column reference 'mon': (possible column names are: dt, order_id, user_id, amount)

2)给出2017年1月的新客数(指在1月才有第一笔订单)

select
    count(distinct (user_id))
from order_tab
group by date_format(dt,'yyyy-MM')
having date_format(min(dt),'yyyy-MM')='2017-01';

如下写法报错,where后里面不能嵌套min

select count(distinct (user_id))
from order_tab
where date_format(min(dt),'yyyy-MM')='2017-01';
org.apache.hadoop.hive.ql.parse.SemanticException:Line 3:18 Not yet supported place for UDAF 'min'

ps

--如下两种写法是ok的,测试ok
select min(dt) from order_tab;
--2017-01-01
select date_format(min(dt),'yyyy-MM-dd') from order_tab;
--2017-01-01

总结

  • min函数可以用于求日期的最小值
  • select 后有聚合函数,如count,非聚合字段要出现在group by中
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值