tnblog
首页
视频
资源
登录

Doris 查询

831人阅读 2025/3/10 10:52 总访问:3660036 评论:0 收藏:0 手机
分类: 大数据

Doris 查询

Doris的查询语法

  1. SELECT
  2. [ALL | DISTINCT | DISTINCTROW ] -- 对查询字段的结果是否需要去重,还是全部保留等参数
  3. select_expr [, select_expr ...] -- select的查询字段
  4. [FROM table_references
  5. [PARTITION partition_list] -- from 哪个库里面的那张表甚至哪一个(几个)分区
  6. [WHERE where_condition] -- WHERE 查询
  7. [GROUP BY {col_name | expr | position} -- group by 聚合
  8. [ASC | DESC], ... [WITH ROLLUP]]
  9. [HAVING where_condition] -- having 针对聚合函数的再一次过滤
  10. [ORDER BY {col_name | expr | position} -- 对结果数据按照字段进行排序
  11. [ASC | DESC], ...] -- 排序规则
  12. [LIMIT {[offset,] row_count | row_count OFFSET offset}] -- 限制输出多少行内容
  13. [INTO OUTFILE 'file_name'] -- 将查询的结果导出到文件中

doris内置函数

条件函数

if函数


语法示例:

  1. if(boolean condition, type valueTrue, type valueFalseOrNull)
  2. --如果表达式 condition 成立,返回结果 valueTrue;否则,返回结果 valueFalseOrNull
  3. --返回值类型:valueTrue 表达式结果的类型


示例:

  1. select id,if(id=1,"true","false") as test_if from test.load_local_file_test

ifnull,nvl,coalesce,nullif函数


ifnull(expr1, expr2):如果 expr1 的值不为 NULL 则返回 expr1,否则返回 expr2.

  1. select ifnull(null,200);
  2. select ifnull(100,200);


nvl(expr1, expr2):如果 expr1 的值不为 NULL 则返回 expr1,否则返回 expr2

  1. select nvl(100,200);


coalesce(expr1, expr2, ...., expr_n)):返回参数中的第一个非空表达式(从左向右)

  1. select coalesce(100,200,300);
  2. select coalesce(null,null,300);


nullif(expr1, expr2):如果两个参数相等,则返回NULL。否则返回第一个参数的值

  1. select nullif(100,100);
  2. select nullif(100,200);

case语法


将表达式和多个可能的值进行比较,当匹配时返回相应的结果
语法示例:

  1. -- 方式一
  2. CASE expression
  3. WHEN condition1 THEN result1
  4. [WHEN condition2 THEN result2]
  5. ...
  6. [WHEN conditionN THEN resultN]
  7. [ELSE result]
  8. END
  9. -- 方式二
  10. CASE WHEN condition1 THEN result1
  11. [WHEN condition2 THEN result2]
  12. ...
  13. [WHEN conditionN THEN resultN]
  14. [ELSE result]
  15. END


示例:

  1. select id,
  2. case id
  3. when 1 then 'id = 1'
  4. when 2 then 'id = 2'
  5. else 'id not exist'
  6. end as test_case
  7. from test.load_local_file_test;

  1. select id,
  2. case
  3. when id = 1 then 'id = 1'
  4. when id = 2 then 'id = 2'
  5. else 'id not exist'
  6. end as test_case
  7. from test.load_local_file_test;

  1. select *,case sex when 1 then '男' when 0 then '女' end 性别 from test.ex_user;

  1. select *,case when sex = 1 then '男' when sex = 0 then '女' end 性别 from test.ex_user;

聚合函数

min_by和max_by


MAX_BY(expr1, expr2):返回expr2最大值所在行的 expr1 (求分组top1的简介函数)

  1. --这里通过找到最大的user_id返回它的年龄
  2. select max_by(age, user_id) from test.ex_user;

求每门课程成绩最高分的那个人


创建一个score.txt文件,添加如下内容:

  1. zss,chinese,99
  2. zss,math,89
  3. zss,English,79
  4. lss,chinese,88
  5. lss,math,88
  6. lss,English,22
  7. www,chinese,99
  8. www,math,45
  9. zll,chinese,23
  10. zll,math,88
  11. zll,English,80
  12. www,English,94


创建一张表并创建名字、学科、分数的字段。

  1. -- 建表语句
  2. create table test.score
  3. (
  4. name varchar(50),
  5. subject varchar(50),
  6. score double
  7. )
  8. DUPLICATE KEY(name)
  9. DISTRIBUTED BY HASH(name) BUCKETS 1
  10. PROPERTIES
  11. (
  12. "replication_num" = "1"
  13. );


然后我们导入数据。

  1. curl -u root: -H "label:score_20240616" -H "column_separator:," -T "C:\Users\bob.he\OneDrive - Oerlikon Group\Desktop\project\Doris\score.txt" http://127.0.0.1:8040/api/test/score/_stream_load


doris中的写法

  1. select
  2. subject,max_by(name,score) as name
  3. from score
  4. group by subject


但是无法处理成绩并列的情况。

group_concat函数


求:每一个人有考试成绩的所有科目

  1. select name,group_concat(subject,',') as all_subject from score group by name


语法示例:

  1. VARCHAR GROUP_CONCAT([DISTINCT] VARCHAR 列名[, VARCHAR sep]
  2. 该函数是类似于 sum() 的聚合函数,group_concat 将结果集中的多行结果连接成一个字符串
  3. -- group_concat对于收集的字段只能是stringvarcharchar类型
  4. --当不指定分隔符的时候,默认使用 ','
  5. VARCHAR :代表GROUP_CONCAT函数返回值类型
  6. [DISTINCT]:可选参数,针对需要拼接的列的值进行去重
  7. [, VARCHAR sep]:拼接成字符串的分隔符,默认是 ','
  1. select name,group_concat(subject,',') as all_subject from score group by name;
  2. 相当于
  3. select name,concat_ws(',',collect_list(subject)) from score group by name;


简单示例:
首先建表并建立表数据。

  1. --建表
  2. create table test.example(
  3. id int,
  4. name varchar(50),
  5. age int,
  6. gender string,
  7. is_marry boolean,
  8. marry_date date,
  9. marry_datetime datetime
  10. )engine = olap
  11. distributed by hash(id) buckets 3
  12. PROPERTIES
  13. (
  14. "replication_num" = "1"
  15. );
  16. --插入数据
  17. insert into example values
  18. (1,'zss',18,'male',0,null,null),
  19. (2,'lss',28,'female',1,'2022-01-01','2022-01-01 11:11:11'),
  20. (3,'ww',38,'male',1,'2022-02-01','2022-02-01 11:11:11'),
  21. (4,'zl',48,'female',0,null,null),
  22. (5,'tq',58,'male',1,'2022-03-01','2022-03-01 11:11:11'),
  23. (6,'mly',18,'male',1,'2022-04-01','2022-04-01 11:11:11'),
  24. (7,null,18,'male',1,'2022-05-01','2022-05-01 11:11:11');


当收集的那一列,有值为null时,他会自动将null的值过滤掉。

  1. select
  2. gender,
  3. group_concat(name,',') as gc_name
  4. from example
  5. group by gender;

  1. select
  2. gender,
  3. group_concat(DISTINCT cast(age as string)) as gc_age
  4. from example
  5. group by gender;

collect_list,collect_set


collect_list用于将某列的所有值收集到一个数组中,包括重复值。
例如,按性别分组,收集每个性别对应的名字列表:

  1. select gender, collect_list(name) as name_list
  2. from test.example
  3. group by gender;


collect_set用于将某列的不重复值收集到一个数组中。
例如,按性别分组,收集每个性别对应的不重复名字集合:

  1. select gender, collect_set(name) as unique_name_set
  2. from test.example
  3. group by gender;

虽然这里的数据不是很体现,但简单来讲上一个是收集重复的,下面那个收集不重复的。

日期函数

获取当前时间


curdate,current_date,now,curtime,current_time,current_timestamp

  1. select current_date(),curdate(), now(),curtime(),current_timestamp();

last_day


DATE last_day(DATETIME date)返回输入日期中月份的最后一天;
28(非闰年的二月份),
29(闰年的二月份),
30(四月,六月,九月,十一月),
31(一月,三月,五月,七月,八月,十月,十二月)
举例:给我返回这个月份中的最后一天的日期 年月日

  1. select last_day('2000-03-03 01:00:00');

from_unixtime


DATETIME FROM_UNIXTIME(INT unix_timestamp[, VARCHAR string_format])将 unix 时间戳转化为对应的 time 格式,返回的格式由 string_format 指定,支持date_format中的format格式,默认为 %Y-%m-%d %H:%i:%s
正常使用的三种格式:
yyyyMMdd
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss

unix_timestamp


这个方法是将日期生成时间搓,可以传三种方法:

  1. UNIX_TIMESTAMP(),
  2. UNIX_TIMESTAMP(DATETIME date),
  3. UNIX_TIMESTAMP(DATETIME date, STRING fmt) -- 给一个日期,指定这个日期的格式
  4. -- 将日期转换成时间戳,返回值是一个int类型


获取当前日期的时间戳

  1. select unix_timestamp();


获取指定日期的时间戳

  1. select unix_timestamp('2022-11-26 01:09:01');


给定一个特殊日期格式的时间戳,指定格式

  1. select unix_timestamp('2022-11-26 01:09-01', '%Y-%m-%d %H:%i-%s');

to_date


DATE TO_DATE(DATETIME)返回 DATETIME 类型中的日期部分。

  1. select to_date("2022-11-20 00:00:00");

extract


extract(unit FROM DATETIME)抽取提取DATETIME某个指定单位的值。
unit单位可以为year, month, day, hour, minute或者second

  1. select
  2. extract(year from '2022-09-22 17:01:30') as year,
  3. extract(month from '2022-09-22 17:01:30') as month,
  4. extract(day from '2022-09-22 17:01:30') as day,
  5. extract(hour from '2022-09-22 17:01:30') as hour,
  6. extract(minute from '2022-09-22 17:01:30') as minute,
  7. extract(second from '2022-09-22 17:01:30') as second;

date_add,date_sub,datediff


语法:

  1. DATE_ADD(DATETIME date,INTERVAL expr type)
  2. DATE_SUB(DATETIME date,INTERVAL expr type)
  3. DATEDIFF(DATETIME expr1,DATETIME expr2)
  4. -- 计算两个日期相差多少天,结果精确到天。
  5. -- 向日期添加指定的时间间隔。
  6. -- date 参数是合法的日期表达式。
  7. -- expr 参数是您希望添加的时间间隔。
  8. -- type 参数可以是下列值:YEAR, MONTH, DAY, HOUR, MINUTE, SECOND


示例:

  1. select date_add('2010-11-30 23:59:59', INTERVAL 2 DAY),date_add('2010-11-30 23:59:59', INTERVAL -2 DAY),datediff('2022-11-27 22:51:56','2022-11-24 22:50:56');

date_format


VARCHAR DATE_FORMAT(DATETIME date, VARCHAR format)将日期类型按照format的类型转化为字符串

  1. select date_format('2007-10-04 22:23:00', '%H:%i:%s'), date_format('2007-10-04 22:23:00', 'yyyy-MM-dd'),date_format('2007-10-04 22:23:00', '%Y-%m');

字符串函数

length,lower,upper,reverse

  1. --返回字符串的长度
  2. SELECT length('Hello, Doris!') AS length_result;
  3. ## 13
  4. --将字符串转换为小写
  5. SELECT lower('HELLO, DORIS!') AS lower_result;
  6. ## hello, doris!
  7. --将字符串转换为大写
  8. SELECT upper('hello, doris!') AS upper_result;
  9. ## HELLO, DORIS!
  10. --返回字符串的反转
  11. SELECT reverse('hello, doris!') AS reverse_result;
  12. ## !sirod ,olleh

lpad,rpad

  1. -- 向左边补齐
  2. SELECT lpad("1", 5, "0");
  3. # 00001
  4. SELECT rpad("1", 5, "0");
  5. # 10000
  6. -- 向右边补齐
  7. SELECT rpad('11', 5, '0');
  8. # 11000

concat,concat_ws


concat(str1, str2, …, strN)
功能:将多个字符串 str1, str2, …, strN 连接成一个字符串。
参数:多个字符串。
返回值:连接后的字符串。

  1. select concat("a", "b");
  2. # ab
  3. select concat("a", "b", "c");
  4. # abc
  5. -- concat中,如果有一个值为null,那么得到的结果就是null
  6. select concat("a", null, "c");
  7. # NULL

substr

  1. --求子字符串,返回第一个参数描述的字符串中从start开始长度为len的部分字符串。
  2. --首字母的下标为1
  3. select substr("Hello doris", 2, 1);
  4. # e
  5. select substr("Hello doris", 1, 2);
  6. # He

ends_with,starts_with


ends_with(str, suffix)
功能:如果字符串 str 以指定的后缀 suffix 结尾,则返回 true,否则返回 false。
参数:
str:要检查的字符串。
suffix:要匹配的后缀字符串。
返回值:BOOLEAN 类型,true 或 false。如果任意参数为 NULL,则返回 NULL。

  1. select ends_with("Hello doris", "doris");
  2. # 1
  3. select ends_with("Hello doris", "Hello");
  4. # 0


starts_with(str, prefix)
功能:如果字符串 str 以指定的前缀 prefix 开头,则返回 true,否则返回 false。
参数:
str:要检查的字符串。
prefix:要匹配的前缀字符串。
返回值:BOOLEAN 类型,true 或 false。如果任意参数为 NULL,则返回 NULL。

  1. select starts_with("hello world","hello");
  2. # 1
  3. select starts_with("hello world","world");
  4. # 0

trim,ltrim,rtrim

  1. VARCHAR trim(VARCHAR str)
  2. -- 将参数 str 中左侧和右侧开始部分连续出现的空格去掉
  3. SELECT trim(' ab d ') str;
  4. #ab d
  5. VARCHAR ltrim(VARCHAR str)
  6. -- 将参数 str 中从左侧部分开始部分连续出现的空格去掉
  7. SELECT ltrim(' ab d') str;
  8. #ab d
  9. VARCHAR rtrim(VARCHAR str)
  10. --将参数 str 中从右侧部分开始部分连续出现的空格去掉
  11. SELECT rtrim('ab d ') str;
  12. # ab d

null_or_empty,not_null_or_empty


BOOLEAN NULL_OR_EMPTY (VARCHAR str)如果字符串为空字符串或者NULL,返回true。否则,返回false。

  1. select null_or_empty(null);
  2. # 1
  3. select null_or_empty("");
  4. # 1
  5. select null_or_empty("a");
  6. # 0


BOOLEAN NOT_NULL_OR_EMPTY (VARCHAR str)如果字符串为空字符串或者NULL,返回false。否则,返回true。

  1. select not_null_or_empty(null);
  2. # 0
  3. select not_null_or_empty("");
  4. # 0
  5. select not_null_or_empty("a");
  6. # 1

replace


VARCHAR REPLACE (VARCHAR str, VARCHAR old, VARCHAR new)将str字符串中的old子串全部替换为new串

  1. select replace("http://www.baidu.com:9090", "9090", "");
  2. # http://www.baidu.com:

split_part


VARCHAR split_part(VARCHAR content, VARCHAR delimiter, INT field)根据分割符拆分字符串, 返回指定的分割部分(从1开始计数)。

  1. select split_part("hello world", " ", 1);
  2. # hello
  3. select split_part("hello world", " ", 2);
  4. # world
  5. select split_part("2019年7月8号", "月", 1);
  6. # 2019年7
  7. select split_part("abca", "a", 1);
  8. #

money_format


VARCHAR money_format(Number)将数字按照货币格式输出,整数部分每隔3位用逗号分隔,小数部分保留2位。

  1. select money_format(17014116);
  2. # 17,014,116.00
  3. select money_format(1123.456);
  4. # 1,123.46
  5. select money_format(1123.4);
  6. # 1,123.40

数学函数

ceil和floor

  1. BIGINT ceil(DOUBLE x)
  2. -- 返回大于或等于x的最小整数值.
  3. select ceil(1);
  4. # 1
  5. select ceil(2.4);
  6. # 3
  7. select ceil(-10.3);
  8. # -10
  9. BIGINT floor(DOUBLE x)
  10. -- 返回小于或等于x的最大整数值.
  11. select floor(1);
  12. # 1
  13. select floor(2.4);
  14. # 2
  15. select floor(-10.3);
  16. # -11

round

  1. round(x), round(x, d)
  2. -- x四舍五入后保留d位小数,d默认为0
  3. -- 如果d为负数,则小数点左边d位为0。如果xdnull,返回null
  4. select round(2.4);
  5. # 2
  6. select round(2.5);
  7. # 3
  8. select round(-3.4);
  9. # -3
  10. select round(-3.5);
  11. # -4
  12. select round(1667.2725, 2);
  13. # 1667.27
  14. select round(1667.2725, -2);
  15. # 1700

truncate

  1. DOUBLE truncate(DOUBLE x, INT d)
  2. -- 按照保留小数的位数dx进行数值截取。
  3. -- 规则如下:
  4. -- d > 0时:保留xd位小数
  5. -- d = 0时:将x的小数部分去除,只保留整数部分
  6. -- d < 0时:将x的小数部分去除,整数部分按照 d所指定的位数,采用数字0进行替换
  7. select truncate(124.3867, 2);
  8. # 124.38
  9. select truncate(124.3867, 0);
  10. # 124
  11. select truncate(-124.3867, -2);
  12. # -100

abs

  1. 数值类型 abs(数值类型 x)
  2. -- 返回x的绝对值.
  3. select abs(-2);
  4. # 2
  5. select abs(3.254655654);
  6. # 3.254655654
  7. select abs(-3254654236547654354654767);
  8. # 3254654236547654354654767

pow

  1. DOUBLE pow(DOUBLE a, DOUBLE b)
  2. -- 求幂次:返回ab次方.
  3. select pow(2,0);
  4. # 1
  5. select pow(2,3);
  6. # 8
  7. select round(pow(3,2.4),2);
  8. # 13.97

greatest和 least

  1. greatest(col_a, col_b, …, col_n)
  2. -- 返回一行中 ncolumn的最大值.若column中有NULL,则返回NULL.
  3. least(col_a, col_b, …, col_n)
  4. -- 返回一行中 ncolumn的最小值.若column中有NULL,则返回NULL.
  5. select greatest(-1, 0, 5, 8);
  6. # 8
  7. select greatest(-1, 0, 5, NULL);
  8. # (NULL)
  9. select greatest(6.3, 4.29, 7.6876);
  10. # 7.6876
  11. select greatest("2022-02-26 20:02:11","2020-01-23 20:02:11","2020-06-22 20:02:11");
  12. # 2022-02-26 20:02:11

JSON函数


首先创建一个测试表。

  1. CREATE TABLE test_json (
  2. id INT,
  3. json_string String
  4. )
  5. DUPLICATE KEY(id)
  6. DISTRIBUTED BY HASH(id) BUCKETS 3
  7. PROPERTIES("replication_num" = "1");


创建一个json.txt测试数据。
数据如下图所示:

  1. 1_{"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]}
  2. 2_{"k1":"v32", "k2": 400, "a1": [{"k1":"v41", "k2": 400}, 2, "a", 4.14],"a2":{"k3":"v33", "k4": 200,"a2": [{"k1":"v41", "k2": 400}, 2, "a", 4.14]}}
  3. 3_{"k1":"v33", "k2": 500, "a1": [{"k1":"v41", "k2": 400}, 3, "a", 5.14],"a2":{"k3":"v33", "k4": 200,"a2": [{"k5":"v42", "k6": 600}]}}
  4. 4_{"k1":"v31"}
  5. 5_{"k1":"v31", "k2": 300}
  6. 6_{"k1":"v31", "k2": 200 ,"a1": []}


json是一种里面存着一对对key,value类型的结构,针对值类型的不同:
1.简单值:”k1”:”v31”
2.数组:[{“k1”:”v41”, “k2”: 400}, 1, “a”, 3.14]
3.对象:”a2”:{“k3”:”v33”, “k4”: 200,”a2”: [{“k5”:”v42”, “k6”: 600}]}
取值的时候,指定的’$.k1’==>这样的东西我们称之为json path ,json的路劲
接下来我们通过本地方式进行导入:

  1. curl -u root: -H "label:load_local_file111111" -H "column_separator:_" -T "C:\Users\bob.he\OneDrive - Oerlikon Group\Desktop\project\Doris\json.txt" http://127.0.0.1:8040/api/test/test_json/_stream_load


insert into 的方式导入一条

  1. INSERT INTO test_json VALUES(7, '{"k1":"v1", "k2": 200}');


下面是查出的数据。


获取int类型K2的值。

  1. SELECT get_json_int(json_string,'$.k2') from test_json


如果我们想获取中括号里面的字符串类型k1我们可以这样写:

  1. SELECT get_json_string(get_json_string(json_string,'$.a1[0]'),'$.k1') from test_json

变成json(json_object函数)


VARCHAR json_object(VARCHAR,...)生成一个包含指定Key-Value对的json object, 传入的参数是key,value对,且key不能为null。

  1. select json_object('time',curtime());
  2. # {"time":"5:48:2"}
  3. SELECT json_object('id', 87, 'name', 'carrot');
  4. # {"id":87,"name":"carrot"}
  5. select json_object('username',null);
  6. # {"username":null}

窗口函数


doris中的窗口函数和hive中的窗口函数的用法一样
首先,我们需要创建一个表 int_t,并插入一些数据以便进行测试。以下是创建表和插入数据的 SQL 语句:

  1. -- 创建表
  2. CREATE TABLE int_t (
  3. x INT,
  4. y INT
  5. )
  6. DUPLICATE KEY(x)
  7. DISTRIBUTED BY HASH(x) BUCKETS 3
  8. PROPERTIES (
  9. "replication_num" = "1" -- 设置复制因子为1
  10. );
  11. -- 插入数据
  12. INSERT INTO int_t (x, y) VALUES
  13. (1, 1),
  14. (1, 2),
  15. (1, 2),
  16. (2, 1),
  17. (2, 2),
  18. (2, 3),
  19. (3, 1),
  20. (3, 1),
  21. (3, 2);

RANK() 函数


RANK() 函数用于根据排序列的值进行排名,如果排序列的值相同,则会并列排名,后续的排名会跳过并列的排名数。

  1. select x, y, rank() over(partition by x order by y) as rank from int_t;


解释:
按照 x 分组,然后在每个分组内按照 y 排序。
对于 x=1 的分组,y=1 排名第 1,y=2 有两个相同的值,都排名第 2,下一个不同的值会排名第 4(跳过了第 3 名)。
对于 x=2 的分组,y=1 排名第 1,y=2 排名第 2,y=3 排名第 3。
对于 x=3 的分组,y=1 有两个相同的值,都排名第 1,y=2 排名第 3。

DENSE_RANK() 函数


DENSE_RANK() 函数也用于根据排序列的值进行排名,如果排序列的值相同,则会并列排名,但后续的排名不会跳过并列的排名数。

  1. select x, y, dense_rank() over(partition by x order by y) as rank from int_t;


解释:
按照 x 分组,然后在每个分组内按照 y 排序。
对于 x=1 的分组,y=1 排名第 1,y=2 有两个相同的值,都排名第 2,下一个不同的值会排名第 3(不会跳过排名)。
对于 x=2 的分组,y=1 排名第 1,y=2 排名第 2,y=3 排名第 3。
对于 x=3 的分组,y=1 有两个相同的值,都排名第 1,y=2 排名第 2。

ROW_NUMBER() 函数


ROW_NUMBER() 函数用于按照分组排序要求,返回连续递增的整数,从 1 开始,不会有重复值,也不会有空缺值。

  1. select x, y, row_number() over(partition by x order by y) as rank from int_t;


解释:
按照 x 分组,然后在每个分组内按照 y 排序。
对于 x=1 的分组,y=1 排名第 1,y=2 的两个值分别排名第 2 和第 3。
对于 x=2 的分组,y=1 排名第 1,y=2 排名第 2,y=3 排名第 3。
对于 x=3 的分组,y=1 的两个值分别排名第 1 和第 2,y=2 排名第 3。

min,max,sum,avg,count

  1. min(x)over() -- 取窗口中x列的最小值
  2. max(x)over() -- 取窗口中x列的最大值
  3. sum(x)over() -- 取窗口中x列的数据总和
  4. avg(x)over() -- 取窗口中x列的数据平均值
  5. count(x)over() -- 取窗口中x列有多少行
  6. unbounded preceding
  7. current row
  8. 1 following
  9. 1 PRECEDING
  10. rows between unbounded preceding and current row --指在当前窗口中第一行到当前行的范围
  11. rows between unbounded preceding and 1 following --指在当前窗口中第一行到当前行下一行的范围
  12. rows between unbounded preceding and 1 PRECEDING --指在当前窗口中第一行到当前行前一行的范围

LAG() 和 LEAD() 窗口函数


创建表并插入数据
首先,我们创建一个表并插入一些数据以便进行测试:

  1. CREATE TABLE sales_data (
  2. date DATE,
  3. product_id INT,
  4. sales_amount DECIMAL(10, 2)
  5. )
  6. PROPERTIES (
  7. "replication_num" = "1" -- 设置复制因子为1
  8. );
  9. -- 插入数据
  10. INSERT INTO sales_data (date, product_id, sales_amount) VALUES
  11. ('2023-10-01', 101, 100.50),
  12. ('2023-10-01', 102, 150.75),
  13. ('2023-10-02', 101, 200.25),
  14. ('2023-10-02', 102, 175.30),
  15. ('2023-10-03', 101, 180.80),
  16. ('2023-10-03', 102, 200.45),
  17. ('2023-10-04', 101, 220.60),
  18. ('2023-10-04', 102, 190.75);
  19. SELECT * from sales_data


LAG() 函数
LAG() 函数用于获取当前行之前若干行的值。

  1. select
  2. date,
  3. product_id,
  4. sales_amount,
  5. lag(sales_amount, 1, NULL) over(partition by product_id order by date) as prev_sales
  6. from sales_data;


LEAD() 函数
LEAD() 函数用于获取当前行之后若干行的值。

  1. select
  2. date,
  3. product_id,
  4. sales_amount,
  5. lead(sales_amount, 1, NULL) over(partition by product_id order by date) as next_sales
  6. from sales_data;


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Windows Docker Doris 容器部署

Windows Docker Doris 容器部署[TOC] 引言Doris 是一款高性能、分布式、可扩展的分析型数据库,适用于海量数据的存储和分...

Doris 分区与桶(学习笔记)

Doris 分区与桶(学习笔记)[TOC] OLTP和OLAPOLTP联机事务处理OLTP(On-Line Transaction Processing) 公司针对自己公司的...

Doris 三种模型(学习笔记)

Doris 三种模型(学习笔记)[TOC] Aggregate聚合键模型是相同key的数据进行自动聚合的表模型。表中的列按照是否设置了 Agg...

Doris 数据的导入导出(学习笔记)

Doris 数据的导入导出(学习笔记)[TOC] 使用 Insert 方式同步数据用户可以通过 MySQL 协议,使用 INSERT 语句进行数据导...

Doris 突然内存升高解决方案

Doris 突然内存升高解决方案[TOC] 发现频繁refresh catalog xxx 会强制使对象相关的Cache失效,默认开启的采样也比较耗...

Doris 作业案例

Doris 作业案例[TOC] 打地鼠案例需求:连续4次命中的人seq:第几次打地鼠m:是否命中,1-&gt; 命中,0 -&gt; 未命中下面是h...

Doris 索引(学习笔记)

Doris 索引(学习笔记)[TOC] 索引索引用于帮助快速过滤或查找数据。目前 Doris 主要支持两类索引:● 内建的智能索引:包...

Doris Rollup(学习笔记)

Doris Rollup(学习笔记)[TOC] ROLLUP 在多维分析中是“上卷”的意思,即将数据按某种指定的粒度进行进一步聚合。之前的...

Doris 物化视图(学习笔记)

Doris 物化视图(学习笔记)[TOC] 就是查询结果预先存储起来的特殊的表。物化视图的出现主要是为了满足用户,既能对原始明...

Doris 中join的优化原理(学习笔记)

Doris 中join的优化原理(学习笔记)[TOC] Shuffle Join(Partitioned Join)Shuffle Join 是:把 A 表和 B 表的数据都根...

用Linq解决商品和其下sku的筛选排序查询

本是sql to linq的东西,但是用的框架是.core 2.1,所以就归到core里吧最近遇到一个稍微复杂点的小问题需求:商城的商品列...

Redis常用查询命令

hash相关查询hash的所有key:hkey + hash名称查询hash的所有某个key:hget + hash名称+ key名称List相关根据key查询list :l...

扩展ef自动映射需要查询的字段(表达式树Expression),动态构建返回值

Entity Framework 动态构造select表达式比如我们需要返回某些字段会采用如下的写法但是发现每次都去写select如果字段很多不...

思宇上课笔记—SQL数据库分页查询的方式

jQuery课堂实例分页在实际开发中经常被用到,今天就来介绍下SQL数据库分页的几种常见方式。 下面的例子都以每分5条数据为一...

Entity Framework常用查询,EF joinEF多表联查,原生sql。EF 多表查询。AsNoTracking

直接执行sql语句//全表查询 List&lt;Users&gt;ulist=se.Database.SqlQuery&lt;Users&gt;(&quot;select*fromusers&quot;).T...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术