CodeGym /课程 /SQL SELF /把分析数据日志记录到单独的表里

把分析数据日志记录到单独的表里

SQL SELF
第 60 级, 课程 1
可用

想象一下,你做了一个一周销售的报表。数据算好了,客户很满意。但一个月后,有人问你:“能不能再给我看看当时那个报表?”如果你之前没把数据存下来,那就只能手动恢复,或者只能说“搞不了”。这不仅麻烦,还可能影响你的口碑。

分析数据日志记录能帮你解决几个重要问题:

  • 保存历史:你能把关键指标(比如收入、订单数)按时间段记录下来。
  • 审计和排查:如果哪里出问题了,随时能查到当时记录的数据。
  • 数据对比:加上时间戳后,你能分析指标随时间的变化。
  • 数据复用:存下来的指标还能在别的分析任务里用。

核心思路:log_analytics表

为了记录分析数据,我们建一个专门的表,存所有关键指标。每个新结果就是表里的一行。为了更好理解怎么用,先来看个基础场景。

表结构示例

在log_analytics表里,我们存报表的数据。结构如下(DDL — Data Definition Language):

CREATE TABLE log_analytics (
    log_id SERIAL PRIMARY KEY, -- 唯一记录ID
    report_name TEXT NOT NULL, -- 报表或指标的名字
    report_date DATE DEFAULT CURRENT_DATE, -- 报表对应的日期
    category TEXT, -- 数据类别(比如地区、产品)
    metric_value NUMERIC NOT NULL, -- 指标的数值
    created_at TIMESTAMP DEFAULT NOW() -- 日志记录的时间
);
  • log_id:记录的主键ID。
  • report_name:报表或指标的名字,比如“Weekly Sales”。
  • report_date:指标对应的日期。比如如果是10月1日的销售,这里就是2023-10-01。
  • category:帮你按地区等分组数据。
  • metric_value:报表指标的数值。
  • created_at:日志记录的时间戳。

往log_analytics表写数据的例子

比如,我们算出了“北方”地区10月的收入。怎么把这个值存下来?

INSERT INTO log_analytics (report_name, report_date, category, metric_value)
VALUES ('Monthly Revenue', '2023-10-01', 'North', 15000.75);

结果:

log_id report_name report_date category metric_value created_at
1 Monthly Revenue 2023-10-01 North 15000.75 2023-10-10 14:35:50

创建日志记录的存储过程

当然,我们不可能每周每月都手动写数据。所以要用存储过程自动化。

来写个简单的收入日志记录函数:

CREATE OR REPLACE FUNCTION log_monthly_revenue(category TEXT, revenue NUMERIC)
RETURNS VOID AS $$
BEGIN
    INSERT INTO log_analytics (report_name, report_date, category, metric_value)
    VALUES ('Monthly Revenue', CURRENT_DATE, category, revenue);
END;
$$ LANGUAGE plpgsql;

现在log_monthly_revenue函数接收两个参数:

  • category:数据类别,比如地区。
  • revenue:收入的数值

调用这个函数写收入的方法:

SELECT log_monthly_revenue('North', 15000.75);

结果和直接INSERT一样。

日志表结构的更多想法

有时候,关键指标不止一个。比如还想记录订单数、平均客单价。来看怎么扩展。

更新一下表结构:

CREATE TABLE log_analytics_extended (
    log_id SERIAL PRIMARY KEY,
    report_name TEXT NOT NULL,
    report_date DATE DEFAULT CURRENT_DATE,
    category TEXT,
    metric_values JSONB NOT NULL, -- 用JSONB格式存多个指标
    created_at TIMESTAMP DEFAULT NOW()
);

这里的重点是用JSONB类型,把多个指标放一个字段里。

往扩展表写数据的例子

比如要同时存收入、订单数、平均客单价。SQL如下:

INSERT INTO log_analytics_extended (report_name, category, metric_values)
VALUES (
    'Monthly Revenue',
    'North',
    '{"revenue": 15000.75, "orders": 45, "avg_check": 333.35}'::jsonb
);

结果:

log_id report_name category metric_values created_at
1 Monthly Revenue North {"revenue": 15000.75, "orders": 45, "avg_check": 333.35} 2023-10-10 14:35:50

日志用法示例:收入分析

比如我们想查10月所有地区的总收入。SQL如下:

SELECT SUM((metric_values->>'revenue')::NUMERIC) AS total_revenue
FROM log_analytics_extended
WHERE report_date BETWEEN '2023-10-01' AND '2023-10-31';

日志用法示例:地区趋势

分析各地区收入的变化:

SELECT category, report_date, (metric_values->>'revenue')::NUMERIC AS revenue
FROM log_analytics_extended
ORDER BY category, report_date;

常见错误处理

记录分析数据时容易犯一些错。来聊聊这些坑和怎么避免。

  • 错误:忘了填类别或日期。建议在表里设默认值,比如DEFAULT CURRENT_DATE。
  • 错误:数据重复。为避免重复,可以加唯一索引:
    CREATE UNIQUE INDEX unique_log_entry
    ON log_analytics (report_name, report_date, category);
    
  • 错误:算指标时被零除。一定要检查除数!用NULLIF:
    SELECT revenue / NULLIF(order_count, 0) AS avg_check FROM orders;
    

实际项目里的应用

分析数据日志记录在很多领域都很有用:

  • 零售:按商品类别追踪收入和销售。
  • 服务:分析服务器或应用的负载。
  • 金融:监控交易和支出。

这些数据不仅能帮你解释发生了什么,还能让你根据日志做决策。现在你已经知道怎么在PostgreSQL里记录分析数据的历史了。很棒,后面还有更多干货等你学!

2
任务
SQL SELF, 第 60 级, 课程 1
已锁定
创建用于记录分析数据的表
创建用于记录分析数据的表
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION