Doris(六) -- 查询语法和内置函数

打印 上一主题 下一主题

主题 525|帖子 525|积分 1575

查询语法和内置函数

查询语法整体结构
  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']                 -- 将查询的结果导出到文件中
复制代码
内置函数

条件函数

if
  1. if(boolean condition, type valueTrue, type valueFalseOrNull)
  2. --如果表达式 condition 成立,返回结果 valueTrue;否则,返回结果 valueFalseOrNull
  3. --返回值类型:valueTrue 表达式结果的类型
  4. 示例:
  5. SQL
  6. mysql> select  user_id, if(user_id = 1, "true", "false") as test_if from test;
  7. +---------+---------+
  8. | user_id | test_if |
  9. +---------+---------+
  10. | 1       | true    |
  11. | 2       | false   |
  12. +---------+---------+
复制代码
ifnull,nvl,coalesce,nullif
  1. ifnull(expr1, expr2)
  2. --如果 expr1 的值不为 NULL 则返回 expr1,否则返回 expr2
  3. nvl(expr1, expr2)
  4. --如果 expr1 的值不为 NULL 则返回 expr1,否则返回 expr2
  5. coalesce(expr1, expr2, ...., expr_n))
  6. --返回参数中的第一个非空表达式(从左向右)
  7. nullif(expr1, expr2)
  8. -- 如果两个参数相等,则返回NULL。否则返回第一个参数的值
  9. mysql> select ifnull(1,0);
  10. +--------------+
  11. | ifnull(1, 0) |
  12. +--------------+
  13. |            1 |
  14. +--------------+
  15. mysql> select nvl(null,10);
  16. +------------------+
  17. | nvl(null,10)     |
  18. +------------------+
  19. |               10 |
  20. +------------------+
  21. mysql> select coalesce(NULL, '1111', '0000');
  22. +--------------------------------+
  23. | coalesce(NULL, '1111', '0000') |
  24. +--------------------------------+
  25. | 1111                           |
  26. +--------------------------------+
  27. mysql> select coalesce(NULL, NULL,NULL,'0000', NULL);
  28. +----------------------------------------+
  29. | coalesce(NULL, NULL,NULL,'0000', NULL) |
  30. +----------------------------------------+
  31. | 0000                                   |
  32. +----------------------------------------+
  33. mysql> select nullif(1,1);
  34. +--------------+
  35. | nullif(1, 1) |
  36. +--------------+
  37. |         NULL |
  38. +--------------+
  39. mysql> select nullif(1,0);
  40. +--------------+
  41. | nullif(1, 0) |
  42. +--------------+
  43. |            1 |
  44. +--------------+
复制代码
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
  16. -- 将表达式和多个可能的值进行比较,当匹配时返回相应的结果
  17. mysql> select user_id,
  18. case user_id
  19. when 1 then 'user_id = 1'
  20. when 2 then 'user_id = 2'
  21. else 'user_id not exist'
  22. end as test_case
  23. from test;
  24. +---------+-------------+
  25. | user_id | test_case   |
  26. +---------+-------------+
  27. | 1       | user_id = 1 |
  28. | 2       | user_id = 2 |
  29. | 3       | 'user_id not exist' |
  30. +---------+-------------+
  31. mysql> select user_id,
  32. case
  33. when user_id = 1 then 'user_id = 1'
  34. when user_id = 2 then 'user_id = 2'
  35. else 'user_id not exist'
  36. end as test_case
  37. from test;
  38. +---------+-------------+
  39. | user_id | test_case   |
  40. +---------+-------------+
  41. | 1       | user_id = 1 |
  42. | 2       | user_id = 2 |
  43. +---------+-------------+
复制代码
聚合函数

min,max,sum,avg,count和mysql用法一致
min_by和max_by
  1. MAX_BY(expr1, expr2)
  2. 返回expr2最大值所在行的 expr1 (求分组top1的简介函数)
  3. MySQL > select * from tbl;
  4. +------+------+------+------+
  5. | k1   | k2   | k3   | k4   |
  6. +------+------+------+------+
  7. |    0 | 3    | 2    |  100 |
  8. |    1 | 2    | 3    |    4 |
  9. |    4 | 3    | 2    |    2 |
  10. |    3 | 4    | 2    |    1 |
  11. +------+------+------+------+
  12. MySQL > select max_by(k1, k4) from tbl;
  13. select max_by(k1, k4) from tbl;
  14. --取k4这个列中的最大值对应的k1这个列的值
  15. +--------------------+
  16. | max_by(`k1`, `k4`) |
  17. +--------------------+
  18. |                  0 |
  19. +--------------------+
  20. -- 练习
  21. name   subject   score
  22. zss,chinese,99
  23. zss,math,89
  24. zss,English,79
  25. lss,chinese,88
  26. lss,math,88
  27. lss,English,22
  28. www,chinese,99
  29. www,math,45
  30. zll,chinese,23
  31. zll,math,88
  32. zll,English,80
  33. www,English,94
  34. -- 建表语句
  35. create table score
  36. (
  37. name varchar(50),
  38. subject varchar(50),
  39. score double
  40. )
  41. DUPLICATE KEY(name)
  42. DISTRIBUTED BY HASH(name) BUCKETS 1;
  43. -- 通过本地文件的方式导入数据
  44. curl \
  45. -u root: \
  46. -H "label:salary" \
  47. -H "column_separator:," \
  48. -T /root/data/salary.txt \
  49. http://doitedu01:8040/api/test/salary/_stream_load
  50. -- 求每门课程成绩最高分的那个人
  51. select  
  52. subject,max_by(name,score) as name
  53. from score
  54. group by subject
  55. +---------+------+
  56. | subject | name |
  57. +---------+------+
  58. | English | www  |
  59. | math    | lss  |
  60. | chinese | www  |
  61. +---------+------+
复制代码
group_concat
  1. VARCHAR GROUP_CONCAT([DISTINCT] VARCHAR 列名[, VARCHAR sep]
  2. 该函数是类似于 sum() 的聚合函数,group_concat 将结果集中的多行结果连接成一个字符串
  3. -- group_concat对于收集的字段只能是string,varchar,char类型  
  4. --当不指定分隔符的时候,默认使用 ','
  5. VARCHAR :代表GROUP_CONCAT函数返回值类型
  6. [DISTINCT]:可选参数,针对需要拼接的列的值进行去重  
  7. [, VARCHAR sep]:拼接成字符串的分隔符,默认是 ','
  8. --建表
  9. create table example(
  10. id int,
  11. name varchar(50),
  12. age int,
  13. gender string,
  14. is_marry boolean,
  15. marry_date date,
  16. marry_datetime datetime
  17. )engine = olap
  18. distributed by hash(id) buckets 3;
  19. --插入数据
  20. insert into example values \
  21. (1,'zss',18,'male',0,null,null),\
  22. (2,'lss',28,'female',1,'2022-01-01','2022-01-01 11:11:11'),\
  23. (3,'ww',38,'male',1,'2022-02-01','2022-02-01 11:11:11'),\
  24. (4,'zl',48,'female',0,null,null),\
  25. (5,'tq',58,'male',1,'2022-03-01','2022-03-01 11:11:11'),\
  26. (6,'mly',18,'male',1,'2022-04-01','2022-04-01 11:11:11'),\
  27. (7,null,18,'male',1,'2022-05-01','2022-05-01 11:11:11');
  28. --当收集的那一列,有值为null时,他会自动将null的值过滤掉
  29. select
  30. gender,
  31. group_concat(name,',') as gc_name
  32. from example
  33. group by gender;
  34. +--------+---------------+
  35. | gender | gc_name       |
  36. +--------+---------------+
  37. | female | zl,lss        |
  38. | male   | zss,ww,tq,mly |
  39. +--------+---------------+
  40. select
  41. gender,
  42. group_concat(DISTINCT cast(age as string)) as gc_age
  43. from example
  44. group by gender;
  45. +--------+------------+
  46. | gender | gc_age     |
  47. +--------+------------+
  48. | female | 48, 28     |
  49. | male   | 58, 38, 18 |
  50. +--------+------------+
  51. -- 求:每一个人有考试成绩的所有科目
  52. select
  53. name,
  54. group_concat(subject,',')  as all_subject
  55. from score
  56. group by name
复制代码
collect_list,collect_set (1.2版本上线)
  1. ARRAY<T> collect_list(expr)
  2. --返回一个包含 expr 中所有元素(不包括NULL)的数组,数组中元素顺序是不确定的。
  3. ARRAY<T> collect_set(expr)
  4. --返回一个包含 expr 中所有去重后元素(不包括NULL)的数组,数组中元素顺序是不确定的。
复制代码
日期函数

获取当前时间
  1. -- curdate,current_date,now,curtime,current_time,current_timestamp
  2. select current_date();
  3. +----------------+
  4. | current_date() |
  5. +----------------+
  6. | 2022-11-25     |
  7. +----------------+
  8. select curdate();
  9. +------------+
  10. | curdate()  |
  11. +------------+
  12. | 2022-11-25 |
  13. +------------+
  14. select now();
  15. +---------------------+
  16. | now()               |
  17. +---------------------+
  18. | 2022-11-25 00:55:15 |
  19. +---------------------+
  20. select curtime();
  21. +-----------+
  22. | curtime() |
  23. +-----------+
  24. | 00:42:13  |
  25. +-----------+
  26. select current_timestamp();
  27. +---------------------+
  28. | current_timestamp() |
  29. +---------------------+
  30. | 2022-11-25 00:42:30 |
  31. +---------------------+
复制代码
last_day(1.2版本上线)
  1. DATE last_day(DATETIME date)
  2. -- 返回输入日期中月份的最后一天;
  3. --'28'(非闰年的二月份),
  4. --'29'(闰年的二月份),
  5. --'30'(四月,六月,九月,十一月),
  6. --'31'(一月,三月,五月,七月,八月,十月,十二月)
  7. select last_day('2000-03-03 01:00:00'); -- 给我返回这个月份中的最后一天的日期  年月日
  8. ERROR 1105 (HY000): errCode = 2, detailMessage = No matching function with signature: last_day(varchar(-1)).
复制代码
from_unixtime
  1. DATETIME FROM_UNIXTIME(INT unix_timestamp[, VARCHAR string_format])
  2. -- 将 unix 时间戳转化为对应的 time 格式,返回的格式由 string_format 指定
  3. --支持date_format中的format格式,默认为 %Y-%m-%d %H:%i:%s
  4. -- 正常使用的三种格式
  5. yyyyMMdd
  6. yyyy-MM-dd
  7. yyyy-MM-dd HH:mm:ss
  8. 示例:
  9. SQL
  10. mysql> select from_unixtime(1196440219);  -- 时区
  11. +---------------------------+
  12. | from_unixtime(1196440219) |
  13. +---------------------------+
  14. | 2007-12-01 00:30:19       |
  15. +---------------------------+
  16. mysql> select from_unixtime(1196440219, 'yyyy-MM-dd HH:mm:ss');
  17. +--------------------------------------------------+
  18. | from_unixtime(1196440219, 'yyyy-MM-dd HH:mm:ss') |
  19. +--------------------------------------------------+
  20. | 2007-12-01 00:30:19                              |
  21. +--------------------------------------------------+
  22. mysql> select from_unixtime(1196440219, '%Y-%m-%d');
  23. +-----------------------------------------+
  24. | from_unixtime(1196440219, '%Y-%m-%d') |
  25. +-----------------------------------------+
  26. | 2007-12-01                              |
  27. +-----------------------------------------+
复制代码
unix_timestamp
  1. UNIX_TIMESTAMP(),
  2. UNIX_TIMESTAMP(DATETIME date),
  3. UNIX_TIMESTAMP(DATETIME date, STRING fmt) -- 给一个日期,指定这个日期的格式
  4. -- 将日期转换成时间戳,返回值是一个int类型
  5. -- 获取当前日期的时间戳
  6. select unix_timestamp();
  7. +------------------+
  8. | unix_timestamp() |
  9. +------------------+
  10. |       1669309722 |
  11. +------------------+
  12. -- 获取指定日期的时间戳
  13. select unix_timestamp('2022-11-26 01:09:01');
  14. +---------------------------------------+
  15. | unix_timestamp('2022-11-26 01:09:01') |
  16. +---------------------------------------+
  17. |                            1669396141 |
  18. +---------------------------------------+
  19. -- 给定一个特殊日期格式的时间戳,指定格式
  20. select unix_timestamp('2022-11-26 01:09-01', '%Y-%m-%d %H:%i-%s');
  21. +------------------------------------------------------------+
  22. | unix_timestamp('2022-11-26 01:09-01', '%Y-%m-%d %H:%i-%s') |
  23. +------------------------------------------------------------+
  24. |                                                 1669396141 |
  25. +------------------------------------------------------------+
复制代码
to_date
  1. DATE TO_DATE(DATETIME)
  2. --返回 DATETIME 类型中的日期部分。
  3. 示例:
  4. SQL
  5. select to_date("2022-11-20 00:00:00");     
  6. +--------------------------------+
  7. | to_date('2022-11-20 00:00:00') |
  8. +--------------------------------+
  9. | 2022-11-20                     |
  10. +--------------------------------+
复制代码
extract
  1. extract(unit FROM DATETIME)   --抽取
  2. -- 提取DATETIME某个指定单位的值。
  3. --unit单位可以为year, month, day, hour, minute或者second
  4. 示例:
  5. SQL
  6. select
  7. extract(year from '2022-09-22 17:01:30') as year,
  8. extract(month from '2022-09-22 17:01:30') as month,
  9. extract(day from '2022-09-22 17:01:30') as day,
  10. extract(hour from '2022-09-22 17:01:30') as hour,
  11. extract(minute from '2022-09-22 17:01:30') as minute,
  12. extract(second from '2022-09-22 17:01:30') as second;
  13. +------+-------+------+------+--------+--------+
  14. | year | month | day  | hour | minute | second |
  15. +------+-------+------+------+--------+--------+
  16. | 2022 |     9 |   22 |   17 |      1 |     30 |
  17. +------+-------+------+------+--------+--------+
复制代码
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
  9. select date_add('2010-11-30 23:59:59', INTERVAL 2 DAY);
  10. +-------------------------------------------------+
  11. | date_add('2010-11-30 23:59:59', INTERVAL 2 DAY) |
  12. +-------------------------------------------------+
  13. | 2010-12-02 23:59:59                             |
  14. +-------------------------------------------------+
  15. --传一个负数进去也就等同于date_sub
  16. select date_add('2010-11-30 23:59:59', INTERVAL -2 DAY);
  17. +--------------------------------------------------+
  18. | date_add('2010-11-30 23:59:59', INTERVAL -2 DAY) |
  19. +--------------------------------------------------+
  20. | 2010-11-28 23:59:59                              |
  21. +--------------------------------------------------+
  22. mysql> select datediff('2022-11-27 22:51:56','2022-11-24 22:50:56');
  23. +--------------------------------------------------------+
  24. | datediff('2022-11-27 22:51:56', '2022-11-24 22:50:56') |
  25. +--------------------------------------------------------+
  26. |                                                      3 |
  27. +--------------------------------------------------------+
复制代码
date_format
  1. VARCHAR DATE_FORMAT(DATETIME date, VARCHAR format)
  2. --将日期类型按照format的类型转化为字符串
  3. 示例:
  4. SQL
  5. select date_format('2007-10-04 22:23:00', '%H:%i:%s');
  6. +------------------------------------------------+
  7. | date_format('2007-10-04 22:23:00', '%H:%i:%s') |
  8. +------------------------------------------------+
  9. | 22:23:00                                       |
  10. +------------------------------------------------+
  11. select date_format('2007-10-04 22:23:00', 'yyyy-MM-dd');
  12. +------------------------------------------------+
  13. | date_format('2007-10-04 22:23:00', '%Y-%m-%d') |
  14. +------------------------------------------------+
  15. | 2007-10-04                                     |
  16. +------------------------------------------------+
复制代码
字符串函数

length,lower,upper,reverse
获取到字符串的长度,对字符串转大小写和字符串的反转
lpad,rpad
  1. VARCHAR rpad(VARCHAR str, INT len, VARCHAR pad)
  2. VARCHAR lpad(VARCHAR str, INT len, VARCHAR pad)
  3. -- 返回 str 中长度为 len(从首字母开始算起)的字符串。
  4. --如果 len 大于 str 的长度,则在 str 的后面不断补充 pad  字符,
  5. --直到该字符串的长度达到 len 为止。如果 len 小于 str 的长度,
  6. --该函数相当于截断 str 字符串,只返回长度为 len  的字符串。
  7. --len 指的是字符长度而不是字节长度。
  8. 示例:
  9. SQL
  10. -- 向左边补齐
  11. SELECT lpad("1", 5, "hellohello");
  12. +---------------------+
  13. | lpad("1", 5, "0") |
  14. +---------------------+
  15. | 00001             |
  16. +---------------------+
  17. -- 向右边补齐
  18. SELECT rpad('11', 5, '0');
  19. +---------------------+
  20. | rpad('11', 5, '0')  |
  21. +---------------------+
  22. | 11000               |
  23. +---------------------+
复制代码
concat,concat_ws
  1. select concat("a", "b");
  2. +------------------+
  3. | concat('a', 'b') |
  4. +------------------+
  5. | ab               |
  6. +------------------+
  7. select concat("a", "b", "c");
  8. +-----------------------+
  9. | concat('a', 'b', 'c') |
  10. +-----------------------+
  11. | abc                   |
  12. +-----------------------+
  13. -- concat中,如果有一个值为null,那么得到的结果就是null
  14. mysql> select concat("a", null, "c");
  15. +------------------------+
  16. | concat('a', NULL, 'c') |
  17. +------------------------+
  18. | NULL                   |
  19. +------------------------+
  20. --使用第一个参数 sep 作为连接符
  21. --将第二个参数以及后续所有参数(或ARRAY中的所有字符串)拼接成一个字符串。
  22. -- 如果分隔符是 NULL,返回 NULL。 concat_ws函数不会跳过空字符串,会跳过 NULL 值。
  23. mysql> select concat_ws("_", "a", "b");
  24. +----------------------------+
  25. | concat_ws("_", "a", "b")   |
  26. +----------------------------+
  27. | a_b                        |
  28. +----------------------------+
  29. mysql> select concat_ws(NULL, "d", "is");
  30. +----------------------------+
  31. | concat_ws(NULL, 'd', 'is') |
  32. +----------------------------+
  33. | NULL                       |
  34. +----------------------------+
复制代码
substr
  1. --求子字符串,返回第一个参数描述的字符串中从start开始长度为len的部分字符串。
  2. --首字母的下标为1。
  3. mysql> select substr("Hello doris", 3, 5);
  4. +-----------------------------+
  5. | substr('Hello doris', 2, 1) |
  6. +-----------------------------+
  7. | e                           |
  8. +-----------------------------+
  9. mysql> select substr("Hello doris", 1, 2);
  10. +-----------------------------+
  11. | substr('Hello doris', 1, 2) |
  12. +-----------------------------+
  13. | He                          |
  14. +-----------------------------+
复制代码
ends_with,starts_with
  1. BOOLEAN ENDS_WITH (VARCHAR str, VARCHAR suffix)
  2. --如果字符串以指定后缀结尾,返回true。否则,返回false。
  3. --任意参数为NULL,返回NULL。
  4. BOOLEAN STARTS_WITH (VARCHAR str, VARCHAR prefix)
  5. --如果字符串以指定前缀开头,返回true。否则,返回false。
  6. --任意参数为NULL,返回NULL。
  7. 示例:
  8. SQL
  9. select ends_with("Hello doris", "doris");
  10. +-----------------------------------+
  11. | ends_with('Hello doris', 'doris') |
  12. +-----------------------------------+
  13. |                                 1 |
  14. +-----------------------------------+
  15. select ends_with("Hello doris", "Hello");
  16. +-----------------------------------+
  17. | ends_with('Hello doris', 'Hello') |
  18. +-----------------------------------+
  19. |                                 0 |
  20. +-----------------------------------+
  21. select starts_with("hello world","hello");
  22. +-------------------------------------+
  23. | starts_with('hello world', 'hello') |
  24. +-------------------------------------+
  25. |                                   1 |
  26. +-------------------------------------+
  27. select starts_with("hello world","world");
  28. +-------------------------------------+
  29. | starts_with('hello world', 'world') |
  30. +-------------------------------------+
  31. |                                   0 |
  32. +-------------------------------------+
复制代码
trim,ltrim,rtrim
  1. VARCHAR trim(VARCHAR str)
  2. -- 将参数 str 中左侧和右侧开始部分连续出现的空格去掉
  3. mysql> SELECT trim('   ab d   ') str;
  4. +------+
  5. | str  |
  6. +------+
  7. | ab d |
  8. +------+
  9. VARCHAR ltrim(VARCHAR str)
  10. -- 将参数 str 中从左侧部分开始部分连续出现的空格去掉
  11. mysql> SELECT ltrim('   ab d') str;
  12. +------+
  13. | str  |
  14. +------+
  15. | ab d |
  16. +------+
  17. VARCHAR rtrim(VARCHAR str)
  18. --将参数 str 中从右侧部分开始部分连续出现的空格去掉
  19. mysql> SELECT rtrim('ab d   ') str;
  20. +------+
  21. | str  |
  22. +------+
  23. | ab d |
  24. +------+
复制代码
null_or_empty,not_null_or_empty
  1. BOOLEAN NULL_OR_EMPTY (VARCHAR str)
  2. -- 如果字符串为空字符串或者NULL,返回true。否则,返回false。
  3. select null_or_empty(null);
  4. +---------------------+
  5. | null_or_empty(NULL) |
  6. +---------------------+
  7. |                   1 |
  8. +---------------------+
  9. select null_or_empty("");
  10. +-------------------+
  11. | null_or_empty('') |
  12. +-------------------+
  13. |                 1 |
  14. +-------------------+
  15. select null_or_empty("a");
  16. +--------------------+
  17. | null_or_empty('a') |
  18. +--------------------+
  19. |                  0 |
  20. +--------------------+
  21. BOOLEAN NOT_NULL_OR_EMPTY (VARCHAR str)
  22. 如果字符串为空字符串或者NULL,返回false。否则,返回true。
  23. select not_null_or_empty(null);
  24. +-------------------------+
  25. | not_null_or_empty(NULL) |
  26. +-------------------------+
  27. |                       0 |
  28. +-------------------------+
  29. select not_null_or_empty("");
  30. +-----------------------+
  31. | not_null_or_empty('') |
  32. +-----------------------+
  33. |                     0 |
  34. +-----------------------+
  35. select not_null_or_empty("a");
  36. +------------------------+
  37. | not_null_or_empty('a') |
  38. +------------------------+
  39. |                      1 |
  40. +------------------------+
复制代码
replace
  1. VARCHAR REPLACE (VARCHAR str, VARCHAR old, VARCHAR new)
  2. -- 将str字符串中的old子串全部替换为new串
  3. mysql> select replace("http://www.baidu.com:9090", "9090", "");
  4. +------------------------------------------------------+
  5. | replace('http://www.baidu.com:9090', '9090', '') |
  6. +------------------------------------------------------+
  7. | http://www.baidu.com:                                |
  8. +------------------------------------------------------+
复制代码
split_part
  1. VARCHAR split_part(VARCHAR content, VARCHAR delimiter, INT field)
  2. -- 根据分割符拆分字符串, 返回指定的分割部分(从一开始计数)。
  3. mysql> select split_part("hello world", " ", 1);
  4. +----------------------------------+
  5. | split_part('hello world', ' ', 1) |
  6. +----------------------------------+
  7. | hello                            |
  8. +----------------------------------+
  9. mysql> select split_part("hello world", " ", 2);
  10. +----------------------------------+
  11. | split_part('hello world', ' ', 2) |
  12. +----------------------------------+
  13. | world                             |
  14. +----------------------------------+
  15. mysql> select split_part("2019年7月8号", "月", 1);
  16. +-----------------------------------------+
  17. | split_part('2019年7月8号', '月', 1)     |
  18. +-----------------------------------------+
  19. | 2019年7                                 |
  20. +-----------------------------------------+
  21. mysql> select split_part("abca", "a", 1);
  22. +----------------------------+
  23. | split_part('abca', 'a', 1) |
  24. +----------------------------+
  25. |                            |
  26. +----------------------------+
复制代码
money_format
  1. VARCHAR money_format(Number)
  2. -- 将数字按照货币格式输出,整数部分每隔3位用逗号分隔,小数部分保留2位
  3. mysql> select money_format(17014116);
  4. +------------------------+
  5. | money_format(17014116) |
  6. +------------------------+
  7. | 17,014,116.00          |
  8. +------------------------+
  9. mysql> select money_format(1123.456);
  10. +------------------------+
  11. | money_format(1123.456) |
  12. +------------------------+
  13. | 1,123.46               |
  14. +------------------------+
  15. mysql> select money_format(1123.4);
  16. +----------------------+
  17. | money_format(1123.4) |
  18. +----------------------+
  19. | 1,123.40             |
  20. +----------------------+
复制代码
数学函数

ceil和floor
  1. BIGINT ceil(DOUBLE x)
  2. -- 返回大于或等于x的最小整数值.
  3. mysql> select ceil(1);
  4. +-----------+
  5. | ceil(1.0) |
  6. +-----------+
  7. |         1 |
  8. +-----------+
  9. mysql> select ceil(2.4);
  10. +-----------+
  11. | ceil(2.4) |
  12. +-----------+
  13. |         3 |
  14. +-----------+
  15. mysql> select ceil(-10.3);
  16. +-------------+
  17. | ceil(-10.3) |
  18. +-------------+
  19. |         -10 |
  20. +-------------+
  21. BIGINT floor(DOUBLE x)
  22. -- 返回小于或等于x的最大整数值.
  23. mysql> select floor(1);
  24. +------------+
  25. | floor(1.0) |
  26. +------------+
  27. |          1 |
  28. +------------+
  29. mysql> select floor(2.4);
  30. +------------+
  31. | floor(2.4) |
  32. +------------+
  33. |          2 |
  34. +------------+
  35. mysql> select floor(-10.3);
  36. +--------------+
  37. | floor(-10.3) |
  38. +--------------+
  39. |          -11 |
  40. +--------------+
复制代码
round
  1. round(x), round(x, d)
  2. -- 将x四舍五入后保留d位小数,d默认为0。
  3. -- 如果d为负数,则小数点左边d位为0。如果x或d为null,返回null。
  4. mysql> select round(2.4);
  5. +------------+
  6. | round(2.4) |
  7. +------------+
  8. |          2 |
  9. +------------+
  10. mysql> select round(2.5);
  11. +------------+
  12. | round(2.5) |
  13. +------------+
  14. |          3 |
  15. +------------+
  16. mysql> select round(-3.4);
  17. +-------------+
  18. | round(-3.4) |
  19. +-------------+
  20. |          -3 |
  21. +-------------+
  22. mysql> select round(-3.5);
  23. +-------------+
  24. | round(-3.5) |
  25. +-------------+
  26. |          -4 |
  27. +-------------+
  28. mysql> select round(1667.2725, 2);
  29. +---------------------+
  30. | round(1667.2725, 2) |
  31. +---------------------+
  32. |             1667.27 |
  33. +---------------------+
  34. mysql> select round(1667.2725, -2);
  35. +----------------------+
  36. | round(1667.2725, -2) |
  37. +----------------------+
  38. |                 1700 |
  39. +----------------------+
复制代码
truncate
  1. DOUBLE truncate(DOUBLE x, INT d)
  2. -- 按照保留小数的位数d对x进行数值截取。
  3. -- 规则如下:
  4. -- 当d > 0时:保留x的d位小数
  5. -- 当d = 0时:将x的小数部分去除,只保留整数部分
  6. -- 当d < 0时:将x的小数部分去除,整数部分按照 d所指定的位数,采用数字0进行替换
  7. mysql> select truncate(124.3867, 2);
  8. +-----------------------+
  9. | truncate(124.3867, 2) |
  10. +-----------------------+
  11. |                124.38 |
  12. +-----------------------+
  13. mysql> select truncate(124.3867, 0);
  14. +-----------------------+
  15. | truncate(124.3867, 0) |
  16. +-----------------------+
  17. |                   124 |
  18. +-----------------------+
  19. mysql> select truncate(-124.3867, -2);
  20. +-------------------------+
  21. | truncate(-124.3867, -2) |
  22. +-------------------------+
  23. |                    -100 |
  24. +-------------------------+
复制代码
abs
  1. 数值类型 abs(数值类型 x)
  2. -- 返回x的绝对值.
  3. mysql> select abs(-2);
  4. +---------+
  5. | abs(-2) |
  6. +---------+
  7. |       2 |
  8. +---------+
  9. mysql> select abs(3.254655654);
  10. +------------------+
  11. | abs(3.254655654) |
  12. +------------------+
  13. |      3.254655654 |
  14. +------------------+
  15. mysql> select abs(-3254654236547654354654767);
  16. +---------------------------------+
  17. | abs(-3254654236547654354654767) |
  18. +---------------------------------+
  19. | 3254654236547654354654767       |
  20. +---------------------------------+
复制代码
pow
  1. DOUBLE pow(DOUBLE a, DOUBLE b)
  2. -- 求幂次:返回a的b次方.
  3. mysql> select pow(2,0);
  4. +---------------+
  5. | pow(2.0, 0.0) |
  6. +---------------+
  7. |             1 |
  8. +---------------+
  9. mysql> select pow(2,3);
  10. +---------------+
  11. | pow(2.0, 3.0) |
  12. +---------------+
  13. |             8 |
  14. +---------------+
  15. mysql> select round(pow(3,2.4),2);
  16. +--------------------+
  17. | pow(3.0, 2.4)      |
  18. +--------------------+
  19. | 13.966610165238235 |
  20. +--------------------+
复制代码
greatest和 least
  1. greatest(col_a, col_b, …, col_n)
  2. -- 返回一行中 n个column的最大值.若column中有NULL,则返回NULL.
  3. least(col_a, col_b, …, col_n)
  4. -- 返回一行中 n个column的最小值.若column中有NULL,则返回NULL.
  5. mysql> select greatest(-1, 0, 5, 8);
  6. +-----------------------+
  7. | greatest(-1, 0, 5, 8) |
  8. +-----------------------+
  9. |                     8 |
  10. +-----------------------+
  11. mysql> select greatest(-1, 0, 5, NULL);
  12. +--------------------------+
  13. | greatest(-1, 0, 5, NULL) |
  14. +--------------------------+
  15. | NULL                     |
  16. +--------------------------+
  17. mysql> select greatest(6.3, 4.29, 7.6876);
  18. +-----------------------------+
  19. | greatest(6.3, 4.29, 7.6876) |
  20. +-----------------------------+
  21. |                      7.6876 |
  22. +-----------------------------+
  23. mysql> select greatest("2022-02-26 20:02:11","2020-01-23 20:02:11","2020-06-22 20:02:11");
  24. +-------------------------------------------------------------------------------+
  25. | greatest('2022-02-26 20:02:11', '2020-01-23 20:02:11', '2020-06-22 20:02:11') |
  26. +-------------------------------------------------------------------------------+
  27. | 2022-02-26 20:02:11                                                           |
  28. +-------------------------------------------------------------------------------+
复制代码
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");
  8. --测试数据
  9. {"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]}
  10. {"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]}}
  11. {"k1":"v33", "k2": 500, "a1": [{"k1":"v41", "k2": 400}, 3, "a", 5.14],"a2":{"k3":"v33", "k4": 200,"a2": [{"k5":"v42", "k6": 600}]}}
  12. {"k1":"v31"}
  13. {"k1":"v31", "k2": 300}
  14. {"k1":"v31", "k2": 200 "a1": []}
  15. --json是一种里面存着一对对key,value类型的结构
  16. --针对值类型的不同:
  17. -- 1.简单值:"k1":"v31"
  18. -- 2.数组:[{"k1":"v41", "k2": 400}, 1, "a", 3.14]
  19. -- 3.对象:"a2":{"k3":"v33", "k4": 200,"a2": [{"k5":"v42", "k6": 600}]}
复制代码
取值的时候,指定的'$.k1'==>这样的东西我们称之为json path ,json的路劲
-- 通过本地文件的方式导入
  1. curl \
  2. -u root: \
  3. -H "label:load_local_file1" \
  4. -H "column_separator:_" \
  5. -T /root/data/json.txt \
  6. http://doitedu01:8040/api/test/test_json/_stream_load
复制代码
  1. -- 用insert into 的方式导入一条
  2. INSERT INTO test_json VALUES(7, '{"k1":"v1", "k2": 200}');
  3. 5.1.7.1get_json_double,get_json_int,get_json_string
  4. DOUBLE get_json_int(VARCHAR json_str, VARCHAR json_path)
  5. INT get_json_int(VARCHAR json_str, VARCHAR json_path)
  6. VARCHAR get_json_string(VARCHAR json_str, VARCHAR json_path)
  7. -- 解析并获取 json 字符串内指定路径的double,int,string 类型的内容。
  8. -- 其中 json_path 必须以 $ 符号作为开头,使用 . 作为路径分割符。
  9. -- 如果路径中包含 . ,则可以使用双引号包围。
  10. -- 使用 [ ] 表示数组下标,从 0 开始。
  11. -- path 的内容不能包含 ", [ 和 ]。
  12. -- 如果 json_string 格式不对,或 json_path 格式不对,或无法找到匹配项,则返回 NULL。
  13. --1.获取到k1对应的value的值
  14. mysql> select  id, get_json_string(json_string,'$.k1') as k1 from test_json;
  15. +------+------+
  16. | id   | k1   |
  17. +------+------+
  18. |    2 | v32  |
  19. |    4 | v31  |
  20. |    5 | v31  |
  21. |    6 | v31  |
  22. |    1 | v31  |
  23. |    3 | v33  |
  24. +------+------+
  25. --2.获取到key 为a1 里面的数组
  26. mysql> select  id, get_json_string(json_string,'$.a1') as arr from test_json;
  27. +------+------------------------------------+
  28. | id   | arr                                |
  29. +------+------------------------------------+
  30. |    1 | [{"k1":"v41","k2":400},1,"a",3.14] |
  31. |    3 | [{"k1":"v41","k2":400},3,"a",5.14] |
  32. |    2 | [{"k1":"v41","k2":400},2,"a",4.14] |
  33. |    4 | NULL                               |
  34. |    5 | NULL                               |
  35. |    6 | []                                 |
  36. +------+------------------------------------+
  37. --3.获取到key 为a1 里面的数组中第一个元素的值
  38. mysql> select  id, get_json_string(json_string,'$.a1[0]') as arr from test_json;
  39. +------+-----------------------+
  40. | id   | arr                   |
  41. +------+-----------------------+
  42. |    2 | {"k1":"v41","k2":400} |
  43. |    1 | {"k1":"v41","k2":400} |
  44. |    3 | {"k1":"v41","k2":400} |
  45. |    4 | NULL                  |
  46. |    5 | NULL                  |
  47. |    6 | NULL                  |
  48. +------+-----------------------+
  49. --4.获取到key 为a1 里面的数组中第一个元素的值(这个值是一个json串,再次获取到这个字符串中)
  50. select  id, get_json_string(get_json_string(json_string,'$.a1[0]'),'$.k1') as arr from test_json;
  51. +------+------+
  52. | id   | arr  |
  53. +------+------+
  54. |    2 | v41  |
  55. |    1 | v41  |
  56. |    3 | v41  |
  57. |    4 | NULL |
  58. |    5 | NULL |
  59. |    6 | NULL |
  60. +------+------+
  61. 6 rows in set (0.02 sec)
复制代码
json_object
  1. VARCHAR json_object(VARCHAR,...)
  2. -- 生成一个包含指定Key-Value对的json object,
  3. -- 传入的参数是key,value对,且key不能为null
  4. MySQL> select json_object('time',curtime());
  5. +--------------------------------+
  6. | json_object('time', curtime()) |
  7. +--------------------------------+
  8. | {"time": "10:49:18"}           |
  9. +--------------------------------+
  10. MySQL> SELECT json_object('id', 87, 'name', 'carrot');
  11. +-----------------------------------------+
  12. | json_object('id', 87, 'name', 'carrot') |
  13. +-----------------------------------------+
  14. | {"id": 87, "name": "carrot"}            |
  15. +-----------------------------------------+
  16. json_object('id', 87, 'name', 'carrot');
  17. MySQL> select json_object('username',null);
  18. +---------------------------------+
  19. | json_object('username', 'NULL') |
  20. +---------------------------------+
  21. | {"username": NULL}              |
  22. +---------------------------------+
复制代码
窗口函数

ROW_NUMBER(),DENSE_RANK(),RANK()
  1. -- 测试rank打行号,名次相同会并列排名,比如两个第一名,就是1 1 然后第二名会显示3
  2. select x, y, rank() over(partition by x order by y) as rank from int_t;
  3. | x  | y    | rank     |
  4. |----|------|----------|
  5. | 1  | 1    | 1        |
  6. | 1  | 2    | 2        |
  7. | 1  | 2    | 2        |
  8. | 2  | 1    | 1        |
  9. | 2  | 2    | 2        |
  10. | 2  | 3    | 3        |
  11. | 3  | 1    | 1        |
  12. | 3  | 1    | 1        |
  13. | 3  | 2    | 3        |
  14. -- 测试dense_rank(),名词相同会并列排名,比如两个第一名,就是1 1 然后第二名会显示2
  15. select x, y, dense_rank() over(partition by x order by y) as rank from int_t;
  16. | x  | y    | rank     |
  17. |----|------|----------|
  18. | 1  | 1    | 1        |
  19. | 1  | 2    | 2        |
  20. | 1  | 2    | 2        |
  21. | 2  | 1    | 1        |
  22. | 2  | 2    | 2        |
  23. | 2  | 3    | 3        |
  24. | 3  | 1    | 1        |
  25. | 3  | 1    | 1        |
  26. | 3  | 2    | 2        |
  27. -- 测试ROW_NUMBER() 按照分组排序要求,返回的编号依次底层,1 2 3 4 5 ,
  28. -- 不会有重复值,也不会有空缺值,就是连续递增的整数,从1 开始
  29. select x, y, row_number() over(partition by x order by y) as rank from int_t;
  30. | x | y    | rank     |
  31. |---|------|----------|
  32. | 1 | 1    | 1        |
  33. | 1 | 2    | 2        |
  34. | 1 | 2    | 3        |
  35. | 2 | 1    | 1        |
  36. | 2 | 2    | 2        |
  37. | 2 | 3    | 3        |
  38. | 3 | 1    | 1        |
  39. | 3 | 1    | 2        |
  40. | 3 | 2    | 3        |
  41. -- 数据
  42. 孙悟空,语文,87
  43. 孙悟空,数学,95
  44. 娜娜,英语,84
  45. 宋宋,语文,64
  46. 孙悟空,英语,68
  47. 宋宋,英语,84
  48. 婷婷,语文,65
  49. 娜娜,语文,94
  50. 宋宋,数学,86
  51. 婷婷,数学,85
  52. 娜娜,数学,56
  53. 婷婷,英语,78
  54. -- 建表语句
  55. create table stu
  56. (
  57. name varchar(50),
  58. subject varchar(50),
  59. score double
  60. )
  61. DUPLICATE KEY(name)
  62. DISTRIBUTED BY HASH(name) BUCKETS 1;
  63. -- 通过本地文件的方式导入数据
  64. curl \
  65. -u root: \
  66. -H "label:num_test" \
  67. -H "column_separator:," \
  68. -T /root/data/stu.txt \
  69. http://doitedu01:8040/api/test/stu/_stream_load
复制代码
需求:
【相同分数并列(假设第一名有两个,排名就是并列第一,然后第三名从2开始)】
1.按照分数降序排序,求每个学科中每个人的名次
2.按照每个人的总分进行升序排列,得到每个人总分名次的名次
【相同分数并列(假设第一名有两个,排名就是并列第一,然后第三名从3开始)】
3.按照学科进行升序排列,得到每个人的每个学科的名次
4.按照每个人的总分进行升序排列,得到每个人总分名次的名次
【相同分数并列
(假设第一名有两个,排名就是并列第一,
就再单独比语文的成绩,然后数学,最后英语,
分数全部一样,按照学生名字的字典顺序,在前的为第一)】
5.按照每个人的总分进行升序排列,得到每个人总分名次的名次
  1. -- 1.按照学科进行升序排列,得到每个人的每个学科的名次
  2. select
  3. name,subject,score,
  4. dense_rank() over(partition by subject order by score desc) as rank
  5. from stu
  6. +-----------+---------+-------+------+
  7. | name      | subject | score | rank |
  8. +-----------+---------+-------+------+
  9. | 孙悟空    | 数学    |    95 |    1 |
  10. | 宋宋      | 数学    |    86 |    2 |
  11. | 婷婷      | 数学    |    85 |    3 |
  12. | 娜娜      | 数学    |    56 |    4 |
  13. | 娜娜      | 英语    |    84 |    1 |
  14. | 宋宋      | 英语    |    84 |    1 |
  15. | 婷婷      | 英语    |    78 |    2 |
  16. | 孙悟空    | 英语    |    68 |    3 |
  17. | 娜娜      | 语文    |    94 |    1 |
  18. | 孙悟空    | 语文    |    87 |    2 |
  19. | 婷婷      | 语文    |    65 |    3 |
  20. | 宋宋      | 语文    |    64 |    4 |
  21. +-----------+---------+-------+------+
  22. -- 2.按照每个人的总分进行升序排列,得到每个人总分名次的名次
  23. select
  24. name,sum_score,
  25. -- 因为是整体按照学生的总分进行求名次,所有学生为1组,就不需要分组了
  26. dense_rank() over(order by sum_score desc) as rank
  27. from
  28. (
  29.     select
  30.     name,sum(score) as sum_score
  31.     from stu
  32.     group by name
  33. ) as t ;
  34. +-----------+-----------+------+
  35. | name      | sum_score | rank |
  36. +-----------+-----------+------+
  37. | 孙悟空    |       250 |    1 |
  38. | 宋宋      |       234 |    2 |
  39. | 娜娜      |       234 |    2 |
  40. | 婷婷      |       228 |    3 |
  41. +-----------+-----------+------+
  42. 【相同分数并列(假设第一名有两个,排名就是并列第一,然后第三名从3开始)】
  43. -- 3.按照学科进行升序排列,得到每个人的每个学科的名次
  44. select
  45. name,subject,score,
  46. rank() over(partition by subject order by score desc) as rank
  47. from stu
  48. +-----------+---------+-------+------+
  49. | name      | subject | score | rank |
  50. +-----------+---------+-------+------+
  51. | 孙悟空    | 数学    |    95 |    1 |
  52. | 宋宋      | 数学    |    86 |    2 |
  53. | 婷婷      | 数学    |    85 |    3 |
  54. | 娜娜      | 数学    |    56 |    4 |
  55. | 娜娜      | 英语    |    84 |    1 |
  56. | 宋宋      | 英语    |    84 |    1 |
  57. | 婷婷      | 英语    |    78 |    3 |
  58. | 孙悟空    | 英语    |    68 |    4 |
  59. | 娜娜      | 语文    |    94 |    1 |
  60. | 孙悟空    | 语文    |    87 |    2 |
  61. | 婷婷      | 语文    |    65 |    3 |
  62. | 宋宋      | 语文    |    64 |    4 |
  63. +-----------+---------+-------+------+
  64. -- 4.按照每个人的总分进行升序排列,得到每个人总分名次的名次
  65. select
  66. name,sum_score,
  67. -- 因为是整体按照学生的总分进行求名次,所有学生为1组,就不需要分组了
  68. rank() over(order by sum_score desc) as rank
  69. from
  70. (
  71.     select
  72.     name,sum(score) as sum_score
  73.     from stu
  74.     group by name
  75. ) as t ;
  76. +-----------+-----------+------+
  77. | name      | sum_score | rank |
  78. +-----------+-----------+------+
  79. | 孙悟空    |       250 |    1 |
  80. | 宋宋      |       234 |    2 |
  81. | 娜娜      |       234 |    2 |
  82. | 婷婷      |       228 |    4 |
  83. +-----------+-----------+------+
  84. 【相同分数并列
  85. (假设第一名有两个,排名就是并列第一,
  86. 就再单独比语文的成绩,然后数学,最后英语,
  87. 分数全部一样,按照学生名字的字典顺序,在前的为第一)】
  88. -- 5.按照每个人的总分进行升序排列,得到每个人总分名次的名次
  89. --方案1:利用窗口函数来列转行
  90. select
  91. name,subject,score as math_score,english_score,chinese_score,sum_score,
  92. row_number()over(order by sum_score desc ,chinese_score desc ,score desc ,english_score desc,name asc) as num
  93. from
  94. (
  95.         select  
  96.         name,subject,score,
  97.         lead(score,1,0)over(partition by name order by subject) as english_score,
  98.         lead(score,2,0)over(partition by name order by subject) as chinese_score,
  99.         sum(score)over(partition by name) as sum_score,
  100.         row_number()over(partition by name) as num
  101.         from stu
  102. ) as tmp
  103. where num = 1
  104. -- 方案2:利用if判断来列转行
  105.   select
  106. name,chinese_score,match_score,english_score,sum_score,
  107. row_number()over(order by sum_score desc ,chinese_score desc ,match_score desc ,english_score desc,name asc) as num
  108. from
  109. (
  110.     select
  111.     name,
  112.     sum(chinese_score) as chinese_score,
  113.     sum(match_score) as match_score,
  114.     sum(english_score) as english_score,
  115.     sum(chinese_score) + sum(match_score) + sum(english_score) as sum_score
  116.     from
  117.     (
  118.         select  name,subject,
  119.         if(subject = '语文',score,0) as chinese_score,
  120.         if(subject = '数学',score,0) as match_score,
  121.         if(subject = '英语',score,0) as english_score
  122.         from stu
  123.     )as t
  124.     group by name
  125. ) as t1
  126. +-----------+---------+------------+---------------+---------------+-----------+------+
  127. | name      | subject | math_score | english_score | chinese_score | sum_score | num  |
  128. +-----------+---------+------------+---------------+---------------+-----------+------+
  129. | 孙悟空    | 数学    |         95 |            68 |            87 |       250 |    1 |
  130. | 娜娜      | 数学    |         56 |            84 |            94 |       234 |    2 |
  131. | 宋宋      | 数学    |         86 |            84 |            64 |       234 |    3 |
  132. | 婷婷      | 数学    |         85 |            78 |            65 |       228 |    4 |
  133. +-----------+---------+------------+---------------+---------------+-----------+------+
复制代码
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   --指在当前窗口中第一行到当前行前一行的范围
复制代码
LEAD() ,LAG()
  1. -- LAG() 方法用来计算当前行向前数若干行的值。
  2. LAG(expr, offset, default) OVER (partition_by_clause order_by_clause)
  3. -- LEAD() 方法用来计算当前行向后数若干行的值。
  4. LEAD(expr, offset, default]) OVER (partition_by_clause order_by_clause)
复制代码
漏斗模型分析函数window_funnel

业务目标、到达路径,路径步骤、步骤人数,步骤之间的相对转换率和绝对转换率
每一种业务都有他的核心任务和流程,而流程的每一个步骤,都可能有用户流失。
所以如果把每一个步骤及其对应的数据(如UV)拼接起来,就会形成一个上大下小的漏斗形态,这就是漏斗模型
  1. -- 准备数据
  2. uid  event_id   event_action  event_time
  3. u001,e1,view_detail_page,2022-11-01 01:10:21
  4. u001,e2,add_bag_page,2022-11-01 01:11:13
  5. u001,e3,collect_goods_page,2022-11-01 02:07:11
  6. u002,e3,collect_goods_page,2022-11-01 01:10:21
  7. u002,e4,order_detail_page,2022-11-01 01:11:13
  8. u002,e5,pay_detail_page,2022-11-01 02:07:11
  9. u002,e6,click_adver_page,2022-11-01 13:07:23
  10. u002,e7,home_page,2022-11-01 08:18:12
  11. u002,e8,list_detail_page,2022-11-01 23:34:29
  12. u002,e1,view_detail_page,2022-11-01 11:25:32
  13. u002,e2,add_bag_page,2022-11-01 12:41:21
  14. u002,e3,collect_goods_page,2022-11-01 16:21:15
  15. u002,e4,order_detail_page,2022-11-01 21:41:12
  16. u003,e5,pay_detail_page,2022-11-01 01:10:21
  17. u003,e6,click_adver_page,2022-11-01 01:11:13
  18. u003,e7,home_page,2022-11-01 02:07:11
  19. u001,e4,order_detail_page,2022-11-01 13:07:23
  20. u001,e5,pay_detail_page,2022-11-01 08:18:12
  21. u001,e6,click_adver_page,2022-11-01 23:34:29
  22. u001,e7,home_page,2022-11-01 11:25:32
  23. u001,e8,list_detail_page,2022-11-01 12:41:21
  24. u001,e1,view_detail_page,2022-11-01 16:21:15
  25. u001,e2,add_bag_page,2022-11-01 21:41:12
  26. u003,e8,list_detail_page,2022-11-01 13:07:23
  27. u003,e1,view_detail_page,2022-11-01 08:18:12
  28. u003,e2,add_bag_page,2022-11-01 23:34:29
  29. u003,e3,collect_goods_page,2022-11-01 11:25:32
  30. u003,e4,order_detail_page,2022-11-01 12:41:21
  31. u003,e5,pay_detail_page,2022-11-01 16:21:15
  32. u003,e6,click_adver_page,2022-11-01 21:41:12
  33. u004,e7,home_page,2022-11-01 01:10:21
  34. u004,e8,list_detail_page,2022-11-01 01:11:13
  35. u004,e1,view_detail_page,2022-11-01 02:07:11
  36. u004,e2,add_bag_page,2022-11-01 13:07:23
  37. u004,e3,collect_goods_page,2022-11-01 08:18:12
  38. u004,e4,order_detail_page,2022-11-01 23:34:29
  39. u004,e5,pay_detail_page,2022-11-01 11:25:32
  40. u004,e6,click_adver_page,2022-11-01 12:41:21
  41. u004,e7,home_page,2022-11-01 16:21:15
  42. u004,e8,list_detail_page,2022-11-01 21:41:12
  43. u005,e1,view_detail_page,2022-11-01 01:10:21
  44. u005,e2,add_bag_page,2022-11-01 01:11:13
  45. u005,e3,collect_goods_page,2022-11-01 02:07:11
  46. u005,e4,order_detail_page,2022-11-01 13:07:23
  47. u005,e5,pay_detail_page,2022-11-01 08:18:12
  48. u005,e6,click_adver_page,2022-11-01 23:34:29
  49. u005,e7,home_page,2022-11-01 11:25:32
  50. u005,e8,list_detail_page,2022-11-01 12:41:21
  51. u005,e1,view_detail_page,2022-11-01 16:21:15
  52. u005,e2,add_bag_page,2022-11-01 21:41:12
  53. u005,e3,collect_goods_page,2022-11-01 01:10:21
  54. u006,e4,order_detail_page,2022-11-01 01:11:13
  55. u006,e5,pay_detail_page,2022-11-01 02:07:11
  56. u006,e6,click_adver_page,2022-11-01 13:07:23
  57. u006,e7,home_page,2022-11-01 08:18:12
  58. u006,e8,list_detail_page,2022-11-01 23:34:29
  59. u006,e1,view_detail_page,2022-11-01 11:25:32
  60. u006,e2,add_bag_page,2022-11-01 12:41:21
  61. u006,e3,collect_goods_page,2022-11-01 16:21:15
  62. u006,e4,order_detail_page,2022-11-01 21:41:12
  63. u006,e5,pay_detail_page,2022-11-01 23:10:21
  64. u006,e6,click_adver_page,2022-11-01 01:11:13
  65. u007,e7,home_page,2022-11-01 02:07:11
  66. u007,e8,list_detail_page,2022-11-01 13:07:23
  67. u007,e1,view_detail_page,2022-11-01 08:18:12
  68. u007,e2,add_bag_page,2022-11-01 23:34:29
  69. u007,e3,collect_goods_page,2022-11-01 11:25:32
  70. u007,e4,order_detail_page,2022-11-01 12:41:21
  71. u007,e5,pay_detail_page,2022-11-01 16:21:15
  72. u007,e6,click_adver_page,2022-11-01 21:41:12
  73. u007,e7,home_page,2022-11-01 01:10:21
  74. u008,e8,list_detail_page,2022-11-01 01:11:13
  75. u008,e1,view_detail_page,2022-11-01 02:07:11
  76. u008,e2,add_bag_page,2022-11-01 13:07:23
  77. u008,e3,collect_goods_page,2022-11-01 08:18:12
  78. u008,e4,order_detail_page,2022-11-01 23:34:29
  79. u008,e5,pay_detail_page,2022-11-01 11:25:32
  80. u008,e6,click_adver_page,2022-11-01 12:41:21
  81. u008,e7,home_page,2022-11-01 16:21:15
  82. u008,e8,list_detail_page,2022-11-01 21:41:12
  83. u008,e1,view_detail_page,2022-11-01 01:10:21
  84. u009,e2,add_bag_page,2022-11-01 01:11:13
  85. u009,e3,collect_goods_page,2022-11-01 02:07:11
  86. u009,e4,order_detail_page,2022-11-01 13:07:23
  87. u009,e5,pay_detail_page,2022-11-01 08:18:12
  88. u009,e6,click_adver_page,2022-11-01 23:34:29
  89. u009,e7,home_page,2022-11-01 11:25:32
  90. u009,e8,list_detail_page,2022-11-01 12:41:21
  91. u009,e1,view_detail_page,2022-11-01 16:21:15
  92. u009,e2,add_bag_page,2022-11-01 21:41:12
  93. u009,e3,collect_goods_page,2022-11-01 01:10:21
  94. u010,e4,order_detail_page,2022-11-01 01:11:13
  95. u010,e5,pay_detail_page,2022-11-01 02:07:11
  96. u010,e6,click_adver_page,2022-11-01 13:07:23
  97. u010,e7,home_page,2022-11-01 08:18:12
  98. u010,e8,list_detail_page,2022-11-01 23:34:29
  99. u010,e5,pay_detail_page,2022-11-01 11:25:32
  100. u010,e6,click_adver_page,2022-11-01 12:41:21
  101. u010,e7,home_page,2022-11-01 16:21:15
  102. u010,e8,list_detail_page,2022-11-01 21:41:12
  103. -- 创建表
  104. drop table if exists event_info_log;
  105. create table event_info_log
  106. (
  107. uid varchar(20),
  108. event_id varchar(20),
  109. event_action varchar(20),
  110. event_time datetime
  111. )
  112. DUPLICATE KEY(uid)
  113. DISTRIBUTED BY HASH(uid) BUCKETS 1;
  114. -- 通过本地文件的方式导入数据
  115. curl \
  116. -u root: \
  117. -H "label:event_info_log" \
  118. -H "column_separator:," \
  119. -T /root/data/event_log.txt \
  120. http://linux01:8040/api/test/event_info_log/_stream_load
复制代码
封装、要素(时间范围,事件的排序时间依据,漏斗模型的事件链)
  1. window_funnel(window, mode, timestamp_column, event1, event2, ... , eventN)
  2. -- 漏斗分析函数搜索滑动时间窗口内最大的发生的最大事件序列长度。
  3. -- window :滑动时间窗口大小,单位为秒。
  4. -- mode  :保留,目前只支持default。-- 相邻两个事件之间没有时间间隔要求,并且相邻两个事件中可以做其他的事件
  5. -- timestamp_column :指定时间列,类型为DATETIME, 滑动窗口沿着此列工作。
  6. -- eventN :表示事件的布尔表达式。
  7. select
  8. user_id,
  9. window_funnel(3600*24, 'default', event_time, event_id='e1', event_id='e2' , event_id='e4', event_id='e5') as step
  10. from event_info_log
  11. group by user_id
  12. +---------+------+
  13. | user_id | step |
  14. +---------+------+
  15. | u006    |    4 |
  16. | u007    |    2 |
  17. | u005    |    3 |
  18. | u004    |    3 |
  19. | u010    |    0 |
  20. | u001    |    3 |
  21. | u003    |    2 |
  22. | u002    |    3 |
  23. | u008    |    3 |
  24. | u009    |    2 |
  25. +---------+------+
  26. -- 算每一层级的转换率
  27. select
  28. '购买转化漏斗' as funnel_name,
  29. sum(if(step >= 1 ,1,0)) as step1,
  30. sum(if(step >= 2 ,1,0)) as step2,
  31. sum(if(step >= 3 ,1,0)) as step3,
  32. sum(if(step >= 4 ,1,0)) as step4,
  33. round(sum(if(step >= 2 ,1,0))/sum(if(step >= 1 ,1,0)),2) as 'step1->step2_radio',
  34. round(sum(if(step >= 3 ,1,0))/sum(if(step >= 2 ,1,0)),2) as 'step2->step3_radio',
  35. round(sum(if(step >= 4 ,1,0))/sum(if(step >= 3 ,1,0)),2) as 'step3->step4_radio'
  36. from
  37. (
  38. select
  39. user_id,
  40. window_funnel(3600*24, 'default', report_date, event_id='e1', event_id='e2' , event_id='e4', event_id='e5') as step
  41. from event_info_log
  42. where to_date(report_date) = '2022-11-01'
  43. and event_id in('e1','e4','e5','e2')
  44. group by user_id
  45. ) as t1
  46. -- res
  47. +--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+
  48. | funnel_name        | step1 | step2 | step3 | step4 | step1->step2_radio | step2->step3_radio | step3->step4_radio |
  49. +--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+
  50. | 购买转化漏斗       |     9 |     9 |     6 |     1 |                  1 |               0.67 |               0.17 |
  51. +--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表