文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用 MySQL 创建直方图 – 教程

2024-08-27 09:27

关注

要使用 mysql 创建统计查询来构建直方图,您可以使用 count() 函数和 group by 来计算分组约束创建的指定范围或类别内的值的出现次数。

特别是对于时间序列数据,直方图有很多用例,例如监控过去 30 天内每天注册的用户数量。我们在管理后端使用这些查询来监控一些重要的 kpi。

不幸的是,sql 数据库从来没有对表示直方图的本机支持,但它们是用于跟踪各种指标的最常用图表之一。

在本文中,我将向您展示如何为此目的创建查询并克服一些限制。假设您有一个名为 sales 的表,其中包含名为 sale_date 的列,其中包含每次销售的日期和时间。您想要创建一个直方图,显示每月间隔内的销售额分布情况。

select 
    date_format(sale_date, '%y-%m') as sales_month,
    count(*) as count
from 
    sales
group by 
    date_format(sale_date, '%y-%m');

在此查询中:

此查询将为您提供每个月间隔内的销售发生次数,允许您创建直方图以可视化销售随时间的分布情况。

如何填补直方图查询中的空白
运行此查询,您可能会在结果集中看到一些缺失的月份,可能是因为在某些月份没有销售,因此 group by 函数无法生成这些间隔的数据。

如何调整查询以使用默认零值来填补这些空白?否则直方图仍然不完整。

为了填补结果集中的空白并确保代表所有月份,即使某些月份没有销售,您也可以使用递归公用表表达式 (cte) 动态生成所选日历间隔的月份。

它生成涵盖所需时间范围的日期序列。然后,您可以将此日期序列与您的销售数据左连接,以将所有月份包含在结果集中。

with recursive daterange as (
    select 
        date_format(date_sub(date_format(now(), '%y-%m-01'), interval 11 month), '%y-%m-01') as min_date,
        date_format(now(), '%y-%m-01') as max_date
    union all
    select 
        date_format(date_add(min_date, interval 1 month), '%y-%m-01'),
        max_date
    from 
        daterange
    where 
        date_add(min_date, interval 1 month) 



<p>daterange cte(通用表表达式)递归地生成一系列月份,涵盖销售表中最小和最大销售日期之间的时间范围。</p>

<p>此查询根据销售表中的最小和最大销售日期动态生成所选日历间隔的月份,确保所有月份都出现在结果集中。</p>

<h2>
  
  
  用代码填补空白
</h2>

<p>sql 解决方案对于开发人员来说可能不太舒服,而且需要更多的自定义可能会导致更喜欢基于代码的解决方案。</p>

<p>在这种情况下,您可以通过三个简单的步骤获得相同的结果:</p>

这是使用 laravel 和 carbon 库的代码片段:

$dates = [];

// Create the array with the time interval of your interests
for(
    $day = now()-&gt;subDays(31);
    $day-&gt;startOfDay()-&gt;lte(now());
    $day-&gt;addDay()
) {
    $dates[] = [
        'day' =&gt; $day-&gt;format('Y-m-d'),
        'total' =&gt; 0,
    ];
}

// Get the result from the GROUP BY query
$sales = $product-&gt;sales()-&gt;select(DB::raw('DATE(sale_at) as day, CAST(SUM(qty) AS UNSIGNED) as total'))
    -&gt;where('sale_at', '&gt;=', now()-&gt;subDays(31))
    -&gt;groupBy('day')
    -&gt;get();

// Merge them
return array_map(function ($date) use ($sales) {
    foreach ($sales as $sale) {
        if ($date['day'] === $sale['day']) {
            return $sale;
        }
    }
}, $dates);

如果您有兴趣阅读更多有关数据库的文章,您可以查看以下文章:

免费监控您的 php 应用程序

inspector 是一款专为软件开发人员设计的代码执行监控工具。您无需在云基础设施上安装任何内容,只需安装 laravel 软件包即可开始使用。

inspector 超级易于使用,并且需要零配置。

如果您正在寻找 http 监控、查询见解以及将警报和通知转发到您首选消息传递环境的功能,请免费尝试 inspector。 [注册您的帐户+(https://app.inspector.dev/register).

或在网站上了解更多:https://inspector.dev

以上就是使用 MySQL 创建直方图 – 教程的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯