这里写目录标题
同比和环比
同比 :以上年同期为基期相比较,即本期某一时间段与上年某一时间段相比。
计算公式为:同比增长率=(本期数-同期数)/同期数×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 致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- 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, ...) SELECT 值1,值2 FROM table2
--语句形式 2:(需要 table1 和 table2 的字段完全相同)
INSERT INTO table1 SELECT * FROM table2
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.数据不会被漏处理(不会发生数据丢失)