时间维度,是一个与时间有关的聚合概念,它不关心点
,而是关心这些点
能聚合成什么样的数据。比如你开了个饭店,你想知道2019-11-17
这天你的营业毛额,营业额是多少,这时你想要的是当天的一个结果
,而不是流水账
。当天的结果
与流水账
是两个不同维度的数据,当天的结果
是在 流水账
的基础上通过时间
聚合得到的。对于可以对流水账
进行时间
的当天结果
,称之为-时间维度的数据分析
概念和技术实现是两回事,当你知道这一概念后,之后思考问题的流程会变为
会有一个结构性的东西,这一思维模式自己也一直在锻炼,使之可以内化为习惯
对应到mysql中,是一个分组求和的问题
SELECT
DATE_FORMAT(pay_time, "%Y-%m-%d") AS pay_time,
SUM(pay_price) as total_price
FROM
orders
WHERE
pay_time BETWEEN '2019-11-1' AND '2019-11-16'
GROUP BY
DATE_FORMAT(pay_time, "%Y-%m-%d")
时间维度
只是在基础维度
上加了一个时间的因子GROUP BY DATE_FORMAT(pay_time, "%Y-%m-%d")
。
上方查询是以DATE_FORMAT(pay_time, "%Y-%m-%d")
为时间粒度的,也可以DATE_FORMAT(pay_time, "%Y-%m")
DATE_FORMAT(pay_time, "%Y")
为时间粒度。虽然粒度不同,但还是在时间维度上进行查询的
1 定义一个OrderFilter
<?php
namespace App\Services\Search\Db\Filter;
class OrderFilter extends QueryFilter//参见https://jc91715.top/blog/post/shujufenxi-jichuweidu#8
{
public function start_time($startTime)
{
return $this->builder->where('pay_time', '>=', $startTime);
}
public function end_time($endTime)
{
return $this->builder->where('pay_time','<=', $endTime);
}
}
2 使用
use DB;
DB::table('orders')->->select(DB::raw("DATE_FORMAT(pay_time, "%Y-%m-%d") AS pay_time"))->where(function($query){
app(\App\Services\Search\Db\Filter\OrderFilter::class)->apply($query);
})->groupBy('pay_time')->get();
请求数据的时候带着start_time
和end_time
自动去查询