msql时间分组查询,按照每天某个字段出现的频率统计并排序,按照用户年龄段分组,显示本月订单量按照每日分组

DATE_FORMAT(created,"%Y-%m-%d") # 对数据经行时间格式化created为数据库时间字段
DATE_SUB(NOW(),INTERVAL 30 DAY) # 时间向前减少30天,NOW可以是数据库字段也可以是NOW()代表当前时间
DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 30 DAY),"%Y-%m-%d") # 时间向后30天并格式化NOW()同理
DATE_FORMAT(STR_TO_DATE(etl_date,'%y%m%d'),'%y%m%d') # 不明,奥义·双重格式化?

查询当前日期往前三十天当天有多少数据

SELECT 
DATE_FORMAT(created,"%Y-%m-%d") date,
count(id) total
FROM
follws
WHERE
DATE_FORMAT(created,"%Y-%m-%d") = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 30 DAY),"%Y-%m-%d")
GROUP BY date
#注意这里一定要是 groupby date ,
#不能是created,或者在这里对created进行日期格式化,
#否侧依然是按原数据分组,排序也是如此

查询最近三十天,每天多少数据

SELECT 
DATE_FORMAT(created,"%Y-%m-%d") date,
count(id) total
FROM
follws
WHERE
DATE_FORMAT(created,"%Y-%m-%d") <= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 30 DAY),"%Y-%m-%d")
GROUP BY date

给用户赋值一个随机日期

UPDATE pzh_audio_course SET created = CONCAT(FLOOR(2021 + (RAND() * 0)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0))

查询最近三十天内,每个用户多少数据

统计各个年龄段的用户数量

先查出用户年龄

SELECT
	DATE_FORMAT(NOW(),"%Y") - DATE_FORMAT(birthday,"%Y") oldm
FROM
	pzh_user

在这里插入图片描述
然后根据不同的年龄增加一个字段,对应年龄段,

SELECT
CASE
WHEN olds.old > 0 AND olds.old < 18 THEN '未成年'
WHEN olds.old >18 AND olds.olds.old < 35 THEN '青年'
WHEN olds.old >35 AND olds.old < 55 THEN '中年'
WHEN olds.old >55 AND olds.old < 150 THEN '老年人'
ELSE '神仙' END AS '年龄段',olds.old
FROM
(
SELECT
DATE_FORMAT(NOW(),"%Y") - DATE_FORMAT(birthday,"%Y") AS old
FROM
pzh_user
) AS olds

选中部分就是原来查询年龄列表的sql
在这里插入图片描述
最后我们再根据新增的年龄段字段进行分组统计数量就好了

SELECT
nnds.nnd,
COUNT(*)
FROM
(
	SELECT
	CASE
	WHEN olds.old > 0 AND olds.old < 18 THEN '未成年'
	WHEN olds.old >18 AND olds.old < 35 THEN '青年'
	WHEN olds.old >35 AND olds.old < 55 THEN '中年'
	WHEN olds.old >55 AND olds.old < 150 THEN '老年人'
	ELSE '神仙' END AS 'nnd',olds.old
	FROM
	(
		SELECT
		DATE_FORMAT(NOW(),"%Y") - DATE_FORMAT(birthday,"%Y") AS old
		FROM
		pzh_user
	)	AS olds
) nnds
GROUP BY
nnds.nnd

在这里插入图片描述

查询数据按天分组统计

查询过去10天订单量
   SELECT
   DATE_FORMAT(created,'%Y-%m-%d') datas,
   COUNT(*) AS total
   FROM
   		pzh_user_goods_order
   WHERE
   		created BETWEEN  DATE_SUB(NOW(),INTERVAL 10 DAY) AND NOW()  #要求日期大于10天前小于当前,你也可以直接大于十天前,这里由于测试数据有太多明后天的数据(无语了)用了between
   GROUP BY
   		DATE_FORMAT(created,'%Y-%m-%d')

查询结果:
在这里插入图片描述

查询过去30天订单量,没有订单量的日期也要显示

准备一个辅助表num_aux或者使用mysql自带的一个啥helpxxx的表都行
在这里插入图片描述

SELECT
*
FROM
num_aux num 
LEFT JOIN (
   SELECT
   	DATE_FORMAT(created,'%Y-%m-%d') datas,
     COUNT(*) AS total
   FROM
   		pzh_user_goods_order
   WHERE
   		created BETWEEN  DATE_SUB(NOW(),INTERVAL 30 DAY) AND NOW() 
   GROUP BY
   		DATE_FORMAT(created,'%Y-%m-%d')
) bs  
#这里用当前日期减去辅助表里的顺序数字天数依次关联之前查出来的表的,实现遍历的效果
#相当于是利用顺序数字和当前日期进行运算输出了一个只有指定日期区间的空表,然后在用查出来的数据,
#用日期做外键关联刚才统计出来的每日统计数据,使用leftjoin没有的就显示null
ON bs.datas = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num.num DAY),'%Y-%m-%d') 
WHERE
num.num < 30

查询结果:

在这里插入图片描述
最后做一下调整,由于原来的datas是显示的初始查出来的数据的日期,本来是没有数据的所以这里就会出现null。我们把日期替换成我们通过顺序数字计算出来的日期;
然后再用IFNULL关键字,当数量为空时显示0
如下:

SELECT
DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num.num DAY),'%Y-%m-%d') datas,
IFNULL(bs.total,0) total
FROM
num_aux num 
LEFT JOIN (
   SELECT
   	DATE_FORMAT(created,'%Y-%m-%d') datas,
     COUNT(*) AS total
   FROM
   		pzh_user_goods_order
   WHERE
   		created BETWEEN  DATE_SUB(NOW(),INTERVAL 30 DAY) AND NOW() 
   GROUP BY
   		DATE_FORMAT(created,'%Y-%m-%d')
) bs  
ON bs.datas = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num.num DAY),'%Y-%m-%d') 
WHERE
num.num < 30

查询结果:
在这里插入图片描述

查询本月1日至今的所有数据按天分组,不显示上月

只需要在上面的基础之上,把辅助表的日期限遍历上限设定在今天的数字就可以了;
子表的sql日期限制只要不少于这个数字就可以,保险起见可以同样使用

SELECT
DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num.num DAY),'%Y-%m-%d') datas,
IFNULL(bs.total,0) total
FROM
num_aux num 
LEFT JOIN (
   SELECT
   	DATE_FORMAT(created,'%Y-%m-%d') datas,
     COUNT(*) AS total
   FROM
   		pzh_user_goods_order
   WHERE
   		created BETWEEN  DATE_SUB(NOW(),INTERVAL DATE_FORMAT(NOW(),"%d") DAY) AND NOW() # 这里的减少天数就取第几号
   GROUP BY
   		DATE_FORMAT(created,'%Y-%m-%d')
) bs  
ON bs.datas = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num.num DAY),'%Y-%m-%d') 
WHERE
num.num < DATE_FORMAT(NOW(),"%d") # 这里的辅助表序号遍历天数就取今天第几号

一个查询优化版本

SELECT
dates.d dates,
IFNULL(total,0)
FROM
(
	SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL num DAY),"%Y-%m-%d") d FROM num_aux WHERE num < 7
) dates
LEFT JOIN (
		SELECT DATE_FORMAT(created,"%Y-%m-%d") cd,COUNT(*) total
		FROM pzh_user WHERE created BETWEEN   DATE_SUB(NOW(),INTERVAL 7 DAY) AND NOW()
		GROUP BY created
) u 
ON dates.d = u.cd
ORDER BY
dates.d ASC
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用MySQL的GROUP BY语句和MAX()聚合函数来查询表中某个时间最大值,然后按照某个字段分组。假设您要查询的表名为`table_name`,时间字段为`time_field`,分组字段为`group_field`,则可以使用以下查询语句: ``` SELECT group_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field; ``` 这将返回每个分组字段的最大时间值。如果您还需要包括其他字段,则可以将它们添加到SELECT语句中,并将它们添加到GROUP BY语句中,如下所示: ``` SELECT group_field, other_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field, other_field; ``` 这将返回每个分组字段和其他字段的最大时间值。 ### 回答2: 要查询表中某个时间字段的最大值,并按照另一个字段进行分组,可以使用以下SQL语句: ```sql SELECT 分组字段, MAX(时间字段) AS 最大时间 FROM 表名 GROUP BY 分组字段; ``` 具体步骤如下: 1. 使用SELECT语句来选择字段,并使用MAX函数获取时间字段的最大值。将结果命名为"最大时间"。 2. 使用FROM语句指定要查询的表名。 3. 使用GROUP BY语句来按照指定的字段进行分组。 4. 最后,执行上述SQL语句,查询到表中某个时间字段的最大值,按照某个字段进行分组,并返回结果。 注意事项: - 将"表名"替换为实际的表名。 - 将"时间字段"和"分组字段"替换为实际的字段名。 - 如果要增加其他字段的输出,可在SELECT语句中添加。 例如,查询一个名为"orders"的表中"order_date"字段的最大日期,按照"customer_id"字段进行分组: ```sql SELECT customer_id, MAX(order_date) AS 最大日期 FROM orders GROUP BY customer_id; ``` 这将返回一个结果集,其中每个分组的"customer_id"和对应的最大日期。 ### 回答3: 可以通过以下步骤使用MySQL查询表中某个时间最大值并按照某个字段分组: 1. 使用MAX()函数找到表中某个时间字段的最大值。例如,如果时间字段名为"timestamp",则可以使用以下语句获取最大值: SELECT MAX(timestamp) FROM 表名; 2. 使用GROUP BY子句按照某个字段分组。假设要按照字段"category"进行分组,则可以在查询语句中添加以下代码: GROUP BY category; 所以,最终的查询语句将类似于: SELECT MAX(timestamp) FROM 表名 GROUP BY category; 以上查询语句将返回每个不同类别的时间字段的最大值,并按照类别分组。 注意:请将"表名"和"timestamp"字段名替换为实际使用的表和字段名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值