MYSQL系列(4) 关于时间函数的一些写法

date_format(date, format) 函数用于以不同的格式显示日期/时间数据

参数

date: 合法的日期

format:规定的日期/时间的输出 格式

实例:下面是使用DATE_FORMAT()函数来显示不同的格式,我们使用NOW()来获得当前的日期/时间

date_format(now(), '%b %d %Y %h:%i %p')
date_format(now(), '%m-%d-%Y')
date_format(now(), '%d %b %y')

结果

 Dec 29 2008 11:45 pm
 12-29-2008
 29 Dec 08

date_sub(date, INTERVAL expr type) 函数从日期减去指定的时间间隔

参数:

date:合法的日期表达形式

expr:希望添加的时间间隔

type参数是下面

TYPE值(还有不常用的,具体查询书籍)
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR

实例

假设我们有下面表

OrderId ProductName OrderDate
1 'Computer' 2018-12-29 16:25:46.635

现在我们希望偶从order_date减去2天

select
		OrderId, Date_sub(Orderdate, INTERVAL 2 DAY) AS OrderPayDate
from
		Ordders
	
OrderId OrderPayDate
1 2008-12-27 16:25:46.635

3

now(), curdate(), curtime()

now() curdate() curtime()
2019-10-11 22:22:22 2019-10-11 22:22:22

可以看到curdate()取得是年月日,curtime()取得是时分秒

表table 再短 user_id, order_id, pay_time, order_time,order_amount

  1. 查询过去一个月的付款用户量最高的三天分别是哪天

  2. 查询昨天每个用户最后付款的订单ID及金额

    思路

    1.表的形式应该是

    day count
    2019-01-02 100
    2019-01-19 29
    2019-01-10 10
    1. 求出每天的用户数,每天,按照天进行分组
    2. 条件是过去一个月的付款用户,条件1:付款用户;条件2:过去一个月
    3. 对每天的数量进行排序求前三个
select 
		date_format(pay_time, '%Y-%M-%D') 'day', count(distinct user_id)
from 
		table
where
		order_amount > 0 and month(date_format(pay_time, '%Y-%m-%d')) = 		month(now()) -1
group by  date_format(pay_time, '%Y-%m-%d')
order by  count(distinct user_id) desc limit 3;
  1. 思路

    1.所求表格

    user_id order_id order_amount
    xx xxx xxxx
    1. 对user_id进行分组,条件是昨天, 最后付款时间
select 
		user_id, order_id, order_amount
from
		table
where 
		date_format(pay_time, '%Y-%m-%d') = date_sub(curdate(), interval 1 day)
group by user_id;

二、有PV表a,字段 user_id, goods_id;点击表b 字段user_id, goods_id两表,各存放40亿条user_id的goods_id的访问记录,在防止数据倾斜的情况下,写出依据sql,找出两个表共同的user_id 和相应的goods_id

思路:这里数据倾斜指两个大表在关联的时候卡死的情况,空值解决方案

select
		* 
from
		a inner join b 
on a.user_id is not null and a.user_id = b.user_id
union all
select 
		*
from
		a
where
		a.user_id is null;
		

三、用户登录表 table 字段:user_id, log_time, session_id, plat

查询近30天,每天平均登录用户数量

思路:

  1. 要查询的表格

    avg_count()
    1. 每天的平均用户数量,对log_time进行分组
    2. 查出每一天的登录数量
    3. 求每天平均数量
select
		avg(t.day_count)
from
	(select date_format(log_time, '%Y-%M-%D'),count(user_id) as day_count
    from	table
     where date_format(log_time, '%Y-%m-%d') >= date_sub(curdate(), interval 30 day)
     		and date_format(log_time, '%Y-%m-%d') <curdate()
    group by date_format(log_time, '%Y-%m-%d')
    ) t

四、对于通过不同渠道拉新进来的用户,经过一段时间可能会流失,而留下来的用户我们称之为留存用户。分析哟用户留存是拉新和用户运营的重要指标:

用户访问表:person_visit 字段:user_id(用户id), visit_date(访问时间), page_name(访问页面),plat(访问渠道)

  1. 统计近七天每天到访的新用户数

    思路:

    1. 要求的图表

      time count
      2019-10-1 100

      2.先以用户进行分组,求出每个用户在这七天最小的访问时间,条件是在最近7天内

      1. 再 以求出的这个最小访问时间分组,求出我们需要进行统计的每天访问用户数量
    select
    		t.new_day, count(t.user_id)
    from
    		(select user_id, min(date_format(visit_date, '%Y-%m-%d')) as new_day
            from person_visit
            where date_format(visit_date, '%Y-%m-%d') <= curdate()
            		and date_format(visit_date,'%Y-%m-%d') >= date_sub(curdate(), INTERVAL 						7 day)
             group by user_id
            ) t 
    group by t.new_day
    
  2. 统计每个渠道7天前的新用户的3日留和7日留存率

    1. 每个渠道7天前的新用户数

      表格形式

      plat count_new_user
      a 90

      新用户怎么求,以登录日期为条件过滤求出新用户数

      select 
      		plat, count(distinct user_id)
      from 
      		person_visit
      group by
      		plat
      having 
      		min(date_format(visit_date, '%Y-%m-%d')) = date_sub(curdate(), INTERVAL 7 day)
      		
      
      1. 每个渠道3日留存用户数

        思路: id在7天前登录的用户里3日还登录的数目,用一个子查询来实现

        select  t.plat, count(distinct t.user_id) as '3日用户数'
        from  person_visit as t
        where user_id in (select plat, user_id
        					from person_visit
        					group by plat
        					having min(date_format(visit_date, '%Y-%m-%d')) = 							date_sub(curdate(), INTERVAL 7 day) )
        and date_format(t.visit_date, '%Y-%m-%d') = date_sub(curdate(), INTERVAL 4 day)
        group by t.plat;
        

        3.每个渠道7日留存用户数

        select t.plat, count(distinct t.user_id) as '7日用户数'
        from person_visit as t
        where user_id in (select plat, user_id
                          from person_visit
                          group by plat
                          having min(date_format(visit_date, '%Y-%m-%d')) = 		                     date_sub(curdate(), INTERVAL 7 day))
        and date_format(t.visit_date, '%Y-%m-%d') = date_sub(curdate(), Interval 7 day)
        group by t.plat;
        
posted @ 2019-12-26 14:09  羊驼也要搞大数据  阅读(341)  评论(0编辑  收藏  举报