当前位置:   article > 正文

SQL 与 Hive 技术总结_如何通过sql查询hive的版本

如何通过sql查询hive的版本

0、一个不错的数据分析博主(里面都是数据分析面试题)

  数据分析星球的博客_CSDN博客-笔记,机器学习领域博主数据分析星球擅长笔记,机器学习,等方面的知识https://blog.csdn.net/licent2011?type=blog

1、

Hive 安装_w3cschool所有Hadoop的子项目,如Hive, Pig,和HBase,都需要Linux的操作系统。因此,需要安装Linux OS。以下是为Hive的安装执行的简单步骤:第1步:验证JAVA安装在Hive安装之前,Java必须在系统上已经安装。使用下面的命令来验证是否已经安装Java:$ java –_来自Hive 教程,w3cschool编程狮。https://www.w3cschool.cn/hive_manual/hive_install.html

2、

HIVE:窗口函数,用sql语句查询MySQL安装路径和版本_Jack_2085-CSDN博客SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for test_table-- ----------------------------DROP TABLE IF EXISTS `test_table`;CREATE TABLE `test_table` ( `id` bigint(6) NULL DEFAULT NULL, `prov...https://blog.csdn.net/weixin_54217632/article/details/120243482

3、

    3.1、根据条件查询连续登录N天的用户。

    3.2、查询连续登录天数最大的用户及天数。

  1. 表结构及数据:
  2. DROP TABLE IF EXISTS `test5`;
  3. CREATE TABLE `test5` (
  4. `dt` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  5. `user_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  6. `age` int(11) NULL DEFAULT NULL
  7. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  8. -- ----------------------------
  9. -- Records of test5
  10. -- ----------------------------
  11. INSERT INTO `test5` VALUES ('2021-03-11', 'test_1', 23);
  12. INSERT INTO `test5` VALUES ('2021-03-11', 'test_1', 23);
  13. INSERT INTO `test5` VALUES ('2021-03-11', 'test_1', 23);
  14. INSERT INTO `test5` VALUES ('2021-03-13', 'test_1', 23);
  15. INSERT INTO `test5` VALUES ('2021-03-11', 'test_2', 19);
  16. INSERT INTO `test5` VALUES ('2021-04-11', 'test_3', 39);
  17. INSERT INTO `test5` VALUES ('2021-03-11', 'test_3', 39);
  18. INSERT INTO `test5` VALUES ('2021-03-12', 'test_2', 19);
  19. INSERT INTO `test5` VALUES ('2021-03-15', 'test_2', 19);
  20. INSERT INTO `test5` VALUES ('2021-03-16', 'test_2', 19);
  21. INSERT INTO `test5` VALUES ('2021-03-13', 'test_2', 19);
  22. INSERT INTO `test5` VALUES ('2021-03-14', 'test_2', 19);
  23. SET FOREIGN_KEY_CHECKS = 1;
  24. ------------------------------------------------ 下面是sql的实现语句
  25. -- 方法1case when then 方法
  26. select distinct user_id
  27. from(
  28. SELECT * ,
  29. CASE
  30. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @u_id=user_id and @old:=dt
  31. THEN @size:=@size+1
  32. WHEN @old:=dt
  33. THEN @size:=1
  34. END
  35. AS tt, @u_id:=user_id
  36. FROM (select * from test5
  37. group BY user_id,dt) t
  38. ORDER BY user_id,dt) tb
  39. where tb.tt = 2
  40. -----------------------------------------------------------------
  41. -- 求连续最多登录的天数
  42. select MAX(tt)
  43. from(
  44. SELECT * ,
  45. CASE
  46. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @u_id=user_id and @old:=dt
  47. THEN @size:=@size+1
  48. WHEN @old:=dt
  49. THEN @size:=1
  50. END
  51. AS tt, @u_id:=user_id
  52. FROM (select * from test5
  53. group BY user_id,dt) t
  54. ORDER BY user_id,dt) tb
  55. ------------------------------------------------------------------
  56. -- 查询连续登录系统天数,最多的人和一共连续登录了多少天。
  57. select user_id, tt
  58. from(
  59. SELECT * ,
  60. CASE
  61. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @u_id=user_id and @old:=dt
  62. THEN @size:=@size+1
  63. WHEN @old:=dt
  64. THEN @size:=1
  65. END
  66. AS tt, @u_id:=user_id
  67. FROM (select * from test5
  68. group BY user_id,dt) t
  69. ORDER BY user_id,dt) tb
  70. where tb.tt =
  71. (
  72. select MAX(tt)
  73. from(
  74. SELECT * ,
  75. CASE
  76. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @u_id=user_id and @old:=dt
  77. THEN @size:=@size+1
  78. WHEN @old:=dt
  79. THEN @size:=1
  80. END
  81. AS tt, @u_id:=user_id
  82. FROM (select * from test5
  83. group BY user_id,dt) t
  84. ORDER BY user_id,dt) tb)

 20230214 添加日期:

     

  1. -- 半成品
  2. select user_id,dt,if(a.user_id = a.lag_uid and a.dt = a.lag_dt,@i:=@i+1,@i:=1) as "ranks" from
  3. (select user_id,dt, LAG(user_id,1,0) over() as "lag_uid",
  4. lag(DATE_ADD(dt,INTERVAL 1 DAY),1,0) over() as "lag_dt" from
  5. (select * , rank() over(PARTITION by user_id order by dt) from(
  6. select user_id,dt from test5
  7. GROUP BY user_id,dt)c)d
  8. )a,(select @i:=1)t1
  9. -- 成品
  10. select distinct user_id
  11. from(
  12. select user_id,dt,if(a.user_id = a.lag_uid and a.dt = a.lag_dt,@i:=@i+1,@i:=1) as "ranks" from
  13. (select user_id,dt, LAG(user_id,1,0) over() as "lag_uid",
  14. lag(DATE_ADD(dt,INTERVAL 1 DAY),1,0) over() as "lag_dt" from
  15. (select * from (select * from test5 GROUP BY user_id,dt)k
  16. ORDER BY user_id,dt)d)a,(select @i:=1)t1)t_v
  17. where ranks = 2

202301142336:创建时间:

  1. -- 半成品
  2. select user_id,dt,if(a.user_id = a.lag_uid and a.dt = a.lag_dt,@i:=@i+1,@i:=1) as "ranks" from
  3. (select user_id,dt, LAG(user_id,1,0) over() as "lag_uid",
  4. lag(DATE_ADD(dt,INTERVAL 1 DAY),1,0) over() as "lag_dt" from
  5. (select * , rank() over(PARTITION by user_id order by dt) from(
  6. select user_id,dt from test5
  7. GROUP BY user_id,dt)c)d
  8. )a,(select @i:=1)t1
  9. -- 成品
  10. select distinct user_id
  11. from(
  12. select user_id,dt,if(a.user_id = a.lag_uid and a.dt = a.lag_dt,@i:=@i+1,@i:=1) as "ranks" from
  13. (select user_id,dt, LAG(user_id,1,0) over() as "lag_uid",
  14. lag(DATE_ADD(dt,INTERVAL 1 DAY),1,0) over() as "lag_dt" from
  15. (select * from (select * from test5 GROUP BY user_id,dt)k
  16. ORDER BY user_id,dt)d)a,(select @i:=1)t1)t_v
  17. where ranks = 2
  18. --- 同事写得(查询出连续2天活跃用户)
  19. select distinct user_id from (
  20. SELECT * ,
  21. case when @name=user_id then (
  22. CASE
  23. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @old:=dt THEN @size:=@size+1
  24. WHEN @old:=dt then @size:=1
  25. END
  26. )
  27. when @name:=user_id and @old:=dt then @size:=1
  28. end
  29. AS tt
  30. FROM test5,(SELECT @old:=null,@size:=1,@name:=null)r
  31. ORDER BY user_id,dt
  32. ) t_ where tt = 2;

  问题:先执行语句, 怎么把tt第一个值赋值从1开始:

  

  1. SELECT * ,
  2. case when @name=user_id then (
  3. CASE
  4. WHEN DATE_SUB(str_to_date(dt,'%Y-%m-%d'),INTERVAL 1 DAY) = str_to_date(@old,'%Y-%m-%d') and @old:=dt THEN @size:=@size+1
  5. WHEN @old:=dt then @size:=1
  6. END
  7. )
  8. when @name:=user_id and @old:=dt then @size:=1
  9. end
  10. AS tt
  11. FROM (select * from test5 GROUP BY user_id,dt)uu,(SELECT @old:=null,@size:=1,@name:=null)r
  12. ORDER BY user_id,dt;

4、查询用户连续登录系统

  1. DROP TABLE IF EXISTS `test_login_time`;
  2. CREATE TABLE `test_login_time` (
  3. `id` int(0) NOT NULL,
  4. `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci NULL DEFAULT NULL,
  5. `login_time` datetime(0) NULL DEFAULT NULL,
  6. PRIMARY KEY (`id`) USING BTREE
  7. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_as_ci ROW_FORMAT = Dynamic;
  8. -- ----------------------------
  9. -- Records of test_login_time
  10. -- ----------------------------
  11. INSERT INTO `test_login_time` VALUES (1, 'jack', '2021-11-17 10:15:37');
  12. INSERT INTO `test_login_time` VALUES (2, 'jack', '2021-11-18 10:15:37');
  13. INSERT INTO `test_login_time` VALUES (3, 'jack', '2021-11-19 10:15:37');
  14. INSERT INTO `test_login_time` VALUES (4, 'jack', '2021-11-20 10:15:37');
  15. INSERT INTO `test_login_time` VALUES (5, 'jack', '2021-11-21 10:15:37');
  16. INSERT INTO `test_login_time` VALUES (6, 'jack', '2021-11-22 10:15:37');
  17. INSERT INTO `test_login_time` VALUES (7, 'jack', '2021-11-16 10:15:37');
  18. INSERT INTO `test_login_time` VALUES (8, 'jack', '2021-11-15 10:15:37');
  19. INSERT INTO `test_login_time` VALUES (9, 'lucy', '2021-12-01 10:15:37');
  20. INSERT INTO `test_login_time` VALUES (10, 'lucy', '2021-12-02 10:15:37');
  21. INSERT INTO `test_login_time` VALUES (11, 'lucy', '2021-12-03 10:15:37');
  22. INSERT INTO `test_login_time` VALUES (12, 'lucy', '2021-12-04 10:15:37');
  23. INSERT INTO `test_login_time` VALUES (13, 'lucy', '2021-12-06 10:15:37');
  24. INSERT INTO `test_login_time` VALUES (14, 'lucy', '2021-12-08 10:15:37');
  25. INSERT INTO `test_login_time` VALUES (15, 'lucy', '2021-12-09 10:15:37');
  26. INSERT INTO `test_login_time` VALUES (16, 'lucy', '2021-12-10 10:15:37');
  27. INSERT INTO `test_login_time` VALUES (17, 'mark', '2022-02-01 10:15:37');
  28. INSERT INTO `test_login_time` VALUES (18, 'mark', '2022-02-02 10:15:37');
  29. INSERT INTO `test_login_time` VALUES (19, 'mark', '2022-02-03 10:15:37');
  30. INSERT INTO `test_login_time` VALUES (20, 'mark', '2022-02-04 10:15:37');
  31. INSERT INTO `test_login_time` VALUES (21, 'mark', '2022-03-06 10:15:37');
  32. INSERT INTO `test_login_time` VALUES (22, 'mark', '2022-06-08 10:15:37');
  33. INSERT INTO `test_login_time` VALUES (23, 'mark', '2022-05-09 10:15:37');
  34. INSERT INTO `test_login_time` VALUES (24, 'mark', '2022-05-10 10:15:37');
  35. INSERT INTO `test_login_time` VALUES (25, 'mark', '2023-08-10 10:15:37');
  36. INSERT INTO `test_login_time` VALUES (26, 'mayun', '2099-09-15 10:15:37');
  37. INSERT INTO `test_login_time` VALUES (27, 'mayun', '2099-09-15 10:15:37');
  38. INSERT INTO `test_login_time` VALUES (28, 'mayun', '2099-09-15 10:15:37');
  39. INSERT INTO `test_login_time` VALUES (30, 'mayun', '2099-09-16 10:15:37');
  40. INSERT INTO `test_login_time` VALUES (31, 'mayun', '5999-08-18 10:15:37');
  41. SET FOREIGN_KEY_CHECKS = 1;
  42. -- ---------------------------------------------------
  43. -- 方法1
  44. -- 繁琐版本
  45. select *,
  46. CASE
  47. WHEN lag_t2=1
  48. THEN @size:=@size+1
  49. ELSE
  50. @size:=1
  51. END
  52. AS tt,
  53. -- if方法也行
  54. if(lag_t2=1,@size_2:=@size_2+1,@size_2:=1) as tt_2
  55. from(
  56. select *,
  57. TIMESTAMPDIFF(DAY,lead_t1,login_time) as lag_t2
  58. from(
  59. select *,
  60. lag(t.login_time, 1) over (PARTITION by t.user_name order by t.login_time) as lead_t1
  61. from test_login_time t
  62. ) ta)tab;
  63. ******************************************************************
  64. -- - 简单版本
  65. -- 从来没有连续登录的用户,和连续n次登录的用户。
  66. select *,
  67. if(ta.tg=1 and ta.t_name=1,@size:=@size+1,@size:=1) as t_num
  68. from(
  69. select *,lead(left(login_time,10), 1) over () =
  70. DATE_ADD(left(login_time,10),INTERVAL 1 day) as tg ,
  71. lead(user_name, 1) over () = user_name as t_name
  72. from test_login_time t
  73. ORDER BY t.user_name,t.login_time) ta;
  74. ------------------------------------------------------------ 上面sql的升级版本
  75. select *,@size,
  76. if(ta.tg=1 and ta.t_name=1,@size:=@size+1,@size:=1) as t_num
  77. from(
  78. select *,lead(left(login_time,10), 1) over () =
  79. DATE_ADD(left(login_time,10),INTERVAL 1 day) as tg ,
  80. lead(user_name, 1) over () = user_name as t_name
  81. from test_login_time t
  82. ORDER BY t.user_name,t.login_time) ta;
  83. ------------------------------------------- 下面是个要解决的问题。
  84. -- 为什么下面的sql语句,@size变量不重新计算。
  85. select *,
  86. if(lead(left(login_time,10), 1) over () =
  87. DATE_ADD(left(login_time,10),INTERVAL 1 day),
  88. @size:=@size+1,
  89. @size:=1) as t_num
  90. from(
  91. select * from test_login_time t
  92. ORDER BY t.user_name,t.login_time) ta

5、求各科学生成绩第二名的学生

    

   

  1. DROP TABLE IF EXISTS `km_cj`;
  2. CREATE TABLE `km_cj` (
  3. `km` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci NULL DEFAULT NULL,
  4. `user_id` int(0) NOT NULL,
  5. `cj` bigint(0) NULL DEFAULT NULL
  6. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_as_ci ROW_FORMAT = Dynamic;
  7. -- ----------------------------
  8. -- Records of km_cj
  9. -- ----------------------------
  10. INSERT INTO `km_cj` VALUES ('jack', 8, 1);
  11. INSERT INTO `km_cj` VALUES ('jack', 7, 2);
  12. INSERT INTO `km_cj` VALUES ('jack', 1, 3);
  13. INSERT INTO `km_cj` VALUES ('jack', 2, 4);
  14. INSERT INTO `km_cj` VALUES ('jack', 3, 5);
  15. INSERT INTO `km_cj` VALUES ('jack', 4, 6);
  16. INSERT INTO `km_cj` VALUES ('jack', 5, 7);
  17. INSERT INTO `km_cj` VALUES ('jack', 6, 8);
  18. INSERT INTO `km_cj` VALUES ('lucy', 9, 1);
  19. INSERT INTO `km_cj` VALUES ('lucy', 10, 2);
  20. INSERT INTO `km_cj` VALUES ('lucy', 11, 3);
  21. INSERT INTO `km_cj` VALUES ('lucy', 12, 4);
  22. INSERT INTO `km_cj` VALUES ('lucy', 13, 1);
  23. INSERT INTO `km_cj` VALUES ('lucy', 14, 1);
  24. INSERT INTO `km_cj` VALUES ('lucy', 15, 2);
  25. INSERT INTO `km_cj` VALUES ('lucy', 16, 3);
  26. INSERT INTO `km_cj` VALUES ('mark', 17, 1);
  27. INSERT INTO `km_cj` VALUES ('mark', 18, 2);
  28. INSERT INTO `km_cj` VALUES ('mark', 19, 3);
  29. INSERT INTO `km_cj` VALUES ('mark', 20, 4);
  30. INSERT INTO `km_cj` VALUES ('mark', 21, 1);
  31. INSERT INTO `km_cj` VALUES ('mark', 23, 1);
  32. INSERT INTO `km_cj` VALUES ('mark', 24, 2);
  33. INSERT INTO `km_cj` VALUES ('mark', 22, 1);
  34. INSERT INTO `km_cj` VALUES ('mark', 25, 1);
  35. INSERT INTO `km_cj` VALUES ('mayun', 26, 1);
  36. INSERT INTO `km_cj` VALUES ('mayun', 27, 1);
  37. INSERT INTO `km_cj` VALUES ('mayun', 28, 2);
  38. INSERT INTO `km_cj` VALUES ('mayun', 30, 1);
  39. INSERT INTO `km_cj` VALUES ('mayun', 31, 1);
  40. SET FOREIGN_KEY_CHECKS = 1;
  41. -- -----------------------------------------------------------------
  42. -- -- 用窗口函数,求各科成绩第二名的学生
  43. select * from (
  44. select *,
  45. DENSE_RANK() over (PARTITION by km ORDER BY cj desc) as d_r_num
  46. from km_cj t) ta
  47. where ta.d_r_num=2
  48. -- 用普通方法求各科成绩第二名的学生
  49. select tb_three.km, tb_three.user_id,tb_three.cj
  50. from
  51. (select t_tu.km as km_two, max(t_tu.cj) as max_cj_two from
  52. km_cj t_tu
  53. where t_tu.user_id not in(
  54. select tb.user_id
  55. from
  56. (select km as km_one,max(cj) as max_cj from km_cj t
  57. group by km) ta
  58. LEFT JOIN km_cj tb
  59. on ta.km_one = tb.km and ta.max_cj = tb.cj)
  60. GROUP BY t_tu.km) t_zj
  61. LEFT JOIN km_cj tb_three
  62. on t_zj.km_two=tb_three.km and t_zj.max_cj_two = tb_three.cj

6、求连续3个相同的数。

  1. DROP TABLE IF EXISTS `km_cj`;
  2. CREATE TABLE `km_cj` (
  3. `km` varchar(255) ,
  4. `user_id` int(0),
  5. `cj` bigint(0)
  6. )
  7. INSERT INTO `km_cj` VALUES ('语文', 8, 1);
  8. INSERT INTO `km_cj` VALUES ('语文', 7, 2);
  9. INSERT INTO `km_cj` VALUES ('语文', 1, 3);
  10. INSERT INTO `km_cj` VALUES ('语文', 2, 4);
  11. INSERT INTO `km_cj` VALUES ('语文', 3, 5);
  12. INSERT INTO `km_cj` VALUES ('语文', 4, 6);
  13. INSERT INTO `km_cj` VALUES ('语文', 5, 7);
  14. INSERT INTO `km_cj` VALUES ('语文', 6, 8);
  15. INSERT INTO `km_cj` VALUES ('数学', 9, 1);
  16. INSERT INTO `km_cj` VALUES ('数学', 10, 2);
  17. INSERT INTO `km_cj` VALUES ('数学', 11, 3);
  18. INSERT INTO `km_cj` VALUES ('数学', 12, 4);
  19. INSERT INTO `km_cj` VALUES ('数学', 13, 1);
  20. INSERT INTO `km_cj` VALUES ('数学', 14, 1);
  21. INSERT INTO `km_cj` VALUES ('数学', 15, 2);
  22. INSERT INTO `km_cj` VALUES ('数学', 16, 3);
  23. INSERT INTO `km_cj` VALUES ('英语', 17, 1);
  24. INSERT INTO `km_cj` VALUES ('英语', 18, 2);
  25. INSERT INTO `km_cj` VALUES ('英语', 19, 3);
  26. INSERT INTO `km_cj` VALUES ('英语', 20, 4);
  27. INSERT INTO `km_cj` VALUES ('英语', 21, 1);
  28. INSERT INTO `km_cj` VALUES ('英语', 23, 1);
  29. INSERT INTO `km_cj` VALUES ('英语', 24, 2);
  30. INSERT INTO `km_cj` VALUES ('英语', 22, 1);
  31. INSERT INTO `km_cj` VALUES ('英语', 25, 1);
  32. INSERT INTO `km_cj` VALUES ('体育', 26, 1);
  33. INSERT INTO `km_cj` VALUES ('体育', 27, 1);
  34. INSERT INTO `km_cj` VALUES ('体育', 28, 2);
  35. INSERT INTO `km_cj` VALUES ('体育', 30, 1);
  36. INSERT INTO `km_cj` VALUES ('体育', 31, 1);
  37. -- -----------------------------------------------------------
  38. ---- 求连续3个相同的数。
  39. select DISTINCT t_num
  40. from
  41. (select id,num as t_num,
  42. LEAD(num,1) over () as t1,
  43. LEAD(num,2) over () as t2
  44. from test_num) ta
  45. where ta.t_num = ta.t1 and
  46. ta.t_num = ta.t2

7、关于学生成绩排名的所有问题查询总结:

  1. DROP TABLE IF EXISTS `sc`;
  2. CREATE TABLE `sc` (
  3. `s_id` int(255) ,
  4. `s_g` varchar(10) ,
  5. `s_score` int(4)
  6. ) ;
  7. -- ----------------------------
  8. -- Records of sc
  9. -- ----------------------------
  10. INSERT INTO `sc` VALUES (1, 's1', 79);
  11. INSERT INTO `sc` VALUES (2, 's1', 79);
  12. INSERT INTO `sc` VALUES (3, 's1', 59);
  13. INSERT INTO `sc` VALUES (4, 's2', 81);
  14. INSERT INTO `sc` VALUES (5, 's2', 73);
  15. INSERT INTO `sc` VALUES (6, 's3', 82);
  16. INSERT INTO `sc` VALUES (7, 's3', 82);
  17. INSERT INTO `sc` VALUES (8, 's3', 91);
  18. -- ------------------------------------
  19. select * from sc;
  20. -- s_id 学生id
  21. -- s_g 科目
  22. -- s_score 成绩
  23. -- 实现窗口函数:ROW_NUMBER()
  24. select s_id,s_g,s_score,row_num
  25. from(
  26. select *,
  27. if(s_g=@s_g,@num:=@num+1,@num:=1) as row_num, @s_g:=s_g
  28. from(
  29. select * from sc,(select @num:=null) r
  30. GROUP BY s_g,s_id,s_score
  31. ORDER BY s_g,s_score desc) ta)tab;
  32. -- 实现窗口函数:DENSE_RANK()
  33. select s_id,s_g,s_score,row_num
  34. from(
  35. select *,
  36. if(s_g=@s_g and s_score!=@s_score,@num:=@num+1,if(s_g=@s_g and s_score=@s_score,@num,@num:=1)) as row_num, @s_g:=s_g,@s_score:=s_score
  37. from(
  38. select * from sc,(select @num:=1) r
  39. GROUP BY s_g,s_id,s_score
  40. ORDER BY s_g,s_score desc) ta)tab
  41. -- -------------------问题总结:
  42. -- -- 第一次执行的时候,为什么,row_num 都等于1那?是Navicat的问题,还是sql语句的问题。
  43. -- 一条sql语句 实现窗口函数:ROW_NUMBER(),DENSE_RANK()和RANK()
  44. select
  45. s_id_ten as s_id,s_g_ten as s_g,s_score_ten as s_score,
  46. row_num_one_ten as ROW_NUMBER ,row_num_ten as DENSE_RANK,
  47. z_j_ban as rank
  48. from (
  49. select *,
  50. if(row_num_one_ten=row_num_ten or @row_num_ten=row_num_ten,row_num_ten,row_num_one_ten) as z_j_ban,@row_num_ten:=row_num_ten
  51. from(
  52. select s_id as s_id_ten,s_g as s_g_ten,s_score as s_score_ten,row_num_one as row_num_one_ten,row_num as row_num_ten
  53. from(
  54. select *,
  55. if(s_g=@s_g_one,@num_one:=@num_one+1,@num_one:=1) as row_num_one,@s_g_one:=s_g,
  56. if(s_g=@s_g and s_score!=@s_score,@num:=@num+1,if(s_g=@s_g and s_score=@s_score,@num,@num:=1)) as row_num, @s_g:=s_g,@s_score:=s_score
  57. from(
  58. select * from sc,(select @num_one:=null,@num:=1) r
  59. GROUP BY s_g,s_id,s_score
  60. ORDER BY s_g,s_score desc) ta)tab)tabc)tabcd

8、在没有分组的情况下,实现rank()函数

  1. DROP TABLE IF EXISTS `score`;
  2. CREATE TABLE `score` (
  3. `id` int(11),
  4. `name` varchar(255),
  5. `score` int(11)
  6. );
  7. INSERT INTO `score` VALUES (1, '001', 100);
  8. INSERT INTO `score` VALUES (2, '002', 99);
  9. INSERT INTO `score` VALUES (3, '003', 99);
  10. INSERT INTO `score` VALUES (4, '004', 96);
  11. INSERT INTO `score` VALUES (5, '005', 95);
  12. INSERT INTO `score` VALUES (6, '006', 95);
  13. INSERT INTO `score` VALUES (7, '007', 65);
  14. -- --------------------------------------- 上面是表及数据
  15. select * from score;
  16. -- 用 case when then else end 的实现过程
  17. select
  18. tmp.id,tmp.name,tmp.score,
  19. -- 顺序一直在变大
  20. @j:=@j+1 as j,
  21. -- 只有在前后二次排序值不同时才会使用顺序号
  22. @k:=(case when @pre_score=tmp.score then @k else @j end) as rank,
  23. @pre_score:=tmp.score as pre_score
  24. from
  25. (
  26. -- 成绩排序
  27. select * from score order by score desc
  28. ) tmp,
  29. -- @k 表示最终的排名(相同值时序号相同)
  30. -- @j 表示顺序排名
  31. -- @pre_score上一次排序值
  32. (select @k :=0,@j:=0, @pre_score:=0) sdcore
  33. -- 用 if 的实现过程
  34. select
  35. tmp.id,tmp.name,tmp.score,
  36. -- 顺序一直在变大
  37. @j:=@j+1 as j,
  38. -- 只有在前后二次排序值不同时才会使用顺序号
  39. @k:=if(@pre_score=tmp.score ,@k ,@j) as rank,
  40. @pre_score:=tmp.score as pre_score_ed
  41. from
  42. (
  43. -- 成绩排序
  44. select * from score order by score desc
  45. ) tmp,
  46. -- @k 表示最终的排名(相同值时序号相同)
  47. -- @j 表示顺序排名
  48. -- @pre_score上一次排序值
  49. (select @k :=0,@j:=0, @pre_score:=0) sdcore

9、简单版本:留存率的问题。

  1. -- --- ----数据库表
  2. DROP TABLE IF EXISTS `15.17_user_login`;
  3. CREATE TABLE `15.17_user_login` (
  4. `uid` varchar(255) ,
  5. `login_time` varchar(255)
  6. ) ;
  7. INSERT INTO `15.17_user_login` VALUES ('1', '2019/1/1 6:00');
  8. INSERT INTO `15.17_user_login` VALUES ('2', '2019/1/1 10:00');
  9. INSERT INTO `15.17_user_login` VALUES ('3', '2019/1/1 19:00');
  10. INSERT INTO `15.17_user_login` VALUES ('1', '2019/1/2 10:00');
  11. INSERT INTO `15.17_user_login` VALUES ('2', '2019/1/2 9:00');
  12. INSERT INTO `15.17_user_login` VALUES ('3', '2019/1/2 14:00');
  13. INSERT INTO `15.17_user_login` VALUES ('1', '2019/1/3 8:00');
  14. INSERT INTO `15.17_user_login` VALUES ('2', '2019/1/9 14:00');
  15. INSERT INTO `15.17_user_login` VALUES ('3', '2019/1/9 10:00');
  16. INSERT INTO `15.17_user_login` VALUES ('3', '2019/1/9 15:00');
  17. -- -------------------
  18. select(CASE
  19. WHEN left(login_time,8)="2019/1/2" THEN
  20. "次日留存率"
  21. WHEN left(login_time,8)="2019/1/3" THEN
  22. "3日留存率"
  23. WHEN left(login_time,8)="2019/1/9" THEN
  24. "9日留存率"
  25. ELSE
  26. "其他时间留存率"
  27. END
  28. ) as len_u, count(uid) as id_num from (select * from `15.17_user_login` GROUP BY uid,left(login_time,8)) r
  29. GROUP BY (
  30. CASE
  31. WHEN left(login_time,8)="2019/1/2" THEN
  32. "次日留存率"
  33. WHEN left(login_time,8)="2019/1/3" THEN
  34. "3日留存率"
  35. WHEN left(login_time,8)="2019/1/9" THEN
  36. "9日留存率"
  37. ELSE
  38. "其他时间留存率"
  39. END
  40. )

10、

11、

12、

13、

14、

15、

16、

17、

18、

19、

20、

21、

22、

23、

24、

25、

26、

27、

28、

29、

30、

31、

32、

33、

34、

35、

36、

37、

38、

39、

40、

41、

42、

43、

44、

45、

46、

47、

48、

49、

50.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/855465
推荐阅读
相关标签
  

闽ICP备14008679号