第三周学习笔记

文章介绍了SQL中的JOIN用法,包括INNERJOIN,LEFTJOIN,RIGHTJOIN,以及在Oracle中设置自增列的方法。同时,讨论了同比和环比的计算公式,SQL中计算百分比和与前一列相减的方法。还提到了Flink的流式计算特性和checkpoint机制,以及数据模型中的维度列和指标列概念。
摘要由CSDN通过智能技术生成

同比和环比

同比 :以上年同期为基期相比较,即本期某一时间段与上年某一时间段相比。
计算公式为:同比增长率=(本期数-同期数)/同期数×100%。
例如,某公司 2019 年上半年利润 3000 万元,为本期数, 同期数就是 2018 年上半年的利润 2000 万元,同比增长率为(3000 - 2000)/ 2000×100% = 50%,即某公司 2019 年上半年利润同比增长 50%。
环比 :与上一个相邻统计周期相比较,表明统计指标逐期的发展变化。
计算公式为:环比增长率 =(本期数-上期数)/上期数 ×100%。
例如,某公司 2019 年 6 月份营业额为 100 万元,为本期数,上期数就是 2019 年 5 月份营业额 80 万元,环比增长率为(100 - 80)/ 80×100% =25%,即某公司 2019 年 6 月份营业额环比增长 25%。
来自:http://www.stats.gov.cn/zs/tjws/tjbk/202301/t20230101_1912960.html

SQL中JOIN的使用

JOIN 致分为如下三类:

  1. INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  2. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  3. RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

INNER JOIN 也可以省略 INNER 使用 JOIN,效果一样
在这里插入图片描述
LEFT JOIN 会读取左边数据表的全部数据,即使右边表无对应数据。
在这里插入图片描述
RIGHT JOIN 会读取右边数据表的全部数据,即使左边边表无对应数据。
在这里插入图片描述
来自:https://www.runoob.com/mysql/mysql-join.html

Oracle 设置自增列

跟别的数据库不太一样。
创建一个名为 TEST_ID_SEQ 的序列:

CREATE SEQUENCE TEST_ID_SEQ
INCREMENT BY 1
START WITH 100
MAXVALUE 999999999
NOCYCLE
NOCACHE;

可以用下面的 SQL 命令删除序列:

DROP SEQUENCE TEST_ID_SEQ;

到这一步其实就已经可以实现字段自增,只要插入的时候,将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name1');
SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name2');
SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name3');
SQL> SELECT * FROM "TEST";

为了简化插入操作,可以创建一个触发器,当将数据插入到 “TEST” 表的时候,自动将最新的 ID 插入进去。

CREATE OR REPLACE TRIGGER TEST_ID_SEQ_TRG
BEFORE INSERT ON "TEST"
FOR EACH ROW
WHEN (NEW."ID" IS NULL)
BEGIN
  SELECT TEST_ID_SEQ.NEXTVAL
  INTO :NEW."ID"
  FROM DUAL;
END;

这样的话,每次写插入语句,只需要将 ID 字段的值设置为 NULL 它就会自动递增了:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name4');
SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name5');
SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name6');
SQL> SELECT * FROM "TEST";

来自:https://zhuanlan.zhihu.com/p/25351148
注意: 记得设主键,不然插入报错

sql计算

求百分比

直接计算,然后用concat方法拼接“%”

concat(round(a/b*100 ,2),'%')

其中,round(x,d) 函数用于数据的四舍五入,x指要处理的数,d是指保留几位小数
注:计算如果结果为0,因为四舍五入了,解决方法是 a+0.0,把a变成浮点数。
来自:https://blog.csdn.net/kk_gods/article/details/109643568

与前一列相减

id-lag(id)

SQL String截取

比如这样的数据,我想截取其中的年和月
在这里插入图片描述
截取年可以用

LEFT(month,4)

截取月可以用

substring(month,5)

也可以用:
在这里插入图片描述
在oracle中,LEFT和SUBSTRING都用不了,用SUBSTR方法

-- 截取年:
SUBSTR(MONTH,4)
-- 截取月:
SUBSTR(MONTH,5)

来自:https://www.cnblogs.com/Helloxxm/articles/11400923.html

SQL中 INSERT INTO SELECT 语句

查询一张表的数据并插入到到另一张已经存在的表里

--语句形式 1:
INSERT INTO  table1  (字段1,字段2, ...) SELECT1,2 FROM table2
--语句形式 2:(需要 table1 和 table2 的字段完全相同)
INSERT INTO table1 SELECT * FROM table2

来自:
https://huaweicloud.csdn.net/63a57344b878a54545947b5e.html?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-4-119676217-blog-84936753.235^v38^pc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-4-119676217-blog-84936753.235^v38^pc_relevant_anti_vip_base&utm_relevant_index=9

ORACLE字符串、数字、浮点互转

-- 数字转字符串:
TO_CHAR(000012134)
-- 字符串转字符:
TO_NUMBER('000012134')
-- 字符串字段转浮点型字段
a+0.0/b

问题和报错解决

为什么sql除法结果全是0?

因为四舍五入了,需要设置为浮点型

oracle报错:SQL 命令未正确结束 / ORA-00933: SQL command not properly ended

在Oracle中表名的别名不能使用as

-- 错误写法,报错:命令未正确结束
select * from COLUMN_TB as t where t.id > 0;
-- 正确写法
select * from SUNETL_COLUMN_TB t where t.id > 0;

STARROCKS学习

维度列和指标列

以分为推度列(也成为key列)和指标列(value列),维度列用于分组和排序,指标列可通过聚合函数SUM,COUNT.MN,MAX.REPLACE,HLL UNION,BITMAP UNION等累加起来因此,StarRocks的表也可以认为是多推的key到多推指标的映射.
范围查找 (一种查询优化):
在这里插入图片描述

数据模型

包括:明细模型、聚合模型、更新模型、主键模型
明细模型
StarRocks建表默认采用明细模型,排序列使用稀疏索引,可以快速过滤数据。明细模型用于保存所有历史数据,并且用户可以考虑将过滤条件中频繁使用的维度列作为排序键,比如用户经常需要查看某一时间,可以将事件时间和事件类型作为排序键
在这里插入图片描述

聚合模型
在这里插入图片描述

在这里插入图片描述
更新模型
有些分析场景之下,数据需要进行更新比如拉链表,StarRocks则采用更新模型来满足这种需求,比如电商场景中,订单的状态经常会发生变化,每天的订单更新量可突破上亿。
使用更新模型的场景特点:(1)己经写入的数据有大量的更新需求(2)需要进行实时数据分析
在这里插入图片描述
注:如果Insert一个所有unique key值相同的行,则会覆盖,此时insert=update

主键模型
目前比较适合使用主键模型的场景有这两种:
(1)数据冷热特征,比如最近几天的数据才需要修改,老的冷数据很少需要修改,比如订单数据,老的订单完成后就不在更新,并且分区是按天进行分区的,那么在导入数据时历史分区的数据的主键就不会被加载,也就不会占用内存了,内存中仅会加载近几天的索引。
(2)大宽表(数百列数千列),主键只占整个数据的很小一部分,内存开销比较低。比如用户状态画像表,虽然列非常多,但总的用户数量不大(千万-亿级别),主键索引内存占用相对可控。
注:存入相同主键值的数据则会覆盖,StarRocks收到对某记录的更新操作时,会通过主键索引到该条数据的位置,并对其标记为别除,再插入一条数据,相当于把update改写delete+insert
在这里插入图片描述

flink

流式计算

流数据(或数据流)是指在时间分布和数量上无限的一系列动态数据集合体,数据的价值随着时间的流逝而降低,因此必须实时计算给出秒级响应。流式计算,顾名思义,就是对数据流进行处理,是实时计算。批量计算则统一收集数据,存储到数据库中,然后对数据进行批量处理的数据计算方式。主要体现在以下几个方面:

1、数据时效性不同:流式计算实时、低延迟, 批量计算非实时、高延迟。

2、数据特征不同:流式计算的数据一般是动态的、没有边界的,而批处理的数据一般则是静态数据。

3、应用场景不同:流式计算应用在实时场景,时效性要求比较高的场景,如实时推荐、业务监控…批量计算一般说批处理,应用在实时性要求不高、离线计算的场景下,数据分析、离线报表等。

4、运行方式不同,流式计算的任务持续进行的,批量计算的任务则一次性完成。
在流式计算中,读取的数据就没有结束的时候(无界流)
流式计算中,输出结果的特点是:持续不新地产生最新的结果,所以,流失计算输出的结果数据也将是一个无界流

checkpoint

一个示例:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 每 1000ms 开始一次 checkpoint
env.enableCheckpointing(1000);

// 高级选项:

// 设置模式为精确一次 (这是默认值)
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

// 确认 checkpoints 之间的时间会进行 500 ms
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);

// Checkpoint 必须在一分钟内完成,否则就会被抛弃
env.getCheckpointConfig().setCheckpointTimeout(60000);

// 同一时间只允许一个 checkpoint 进行
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);

// 开启在 job 中止后仍然保留的 externalized checkpoints
env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

// 开启实验性的 unaligned checkpoints
env.getCheckpointConfig().enableUnalignedCheckpoints();

在这里插入图片描述
来自:https://blog.csdn.net/Er_fengV/article/details/120061081

flink的状态checkpoint机制,只是保证:
1故障重启后,各算子能恢复到一个统一的状态(经过了相同数起影啊之后的状态)
2.数据不会被漏处理(不会发生数据丢失)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值