Hive SQL进阶:掌握间隔连续查询技巧,优化大数据分析(二)

news2024/9/21 20:23:29

目录

1.访问次数最多的5个用户

2.近 30 天的每日活跃用户数

3.获取1-180天注册活跃留存表

4.学生名次统计

5.最近连续3周连续活跃用户数

6.最近7天内连续3天活跃用户数 

7.餐馆营业额变化增长

相关拓展


1.访问次数最多的5个用户

输出每个app 下访问次数最多的5个用户 返回字段app_id, top_5_user_id

app_iduser_iddatetime

A

u1

 2020-01-01 00:00:00

B

u2

2020-01-01 00:00:01

A

u1

2020-01-01 00:00:02

C

u2

2020-01-01 01:00:00

WITH ranked_users AS (
  SELECT 
    app_id,
    user_id,
    COUNT(*) AS visit_count,
    ROW_NUMBER() OVER (PARTITION BY app_id ORDER BY COUNT(*) DESC) AS rank
  FROM your_table
  GROUP BY app_id, user_id
)
SELECT 
  app_id,
  STRING_AGG(user_id, ', ' ORDER BY visit_count DESC) AS top_5_user_id
FROM ranked_users
WHERE rank <= 5
GROUP BY app_id;

2.近 30 天的每日活跃用户数

表:Activity

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| session_id    | int     |
| activity_date | date    |
| activity_type | enum    |
+---------------+---------+
该表没有包含重复数据。
activity_type 列是 ENUM(category) 类型, 从 ('open_session', 'end_session', 'scroll_down', 'send_message') 取值。
该表记录社交媒体网站的用户活动。
注意,每个会话只属于一个用户。

编写解决方案,统计截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。

SELECT 
    activity_date AS day,
    COUNT(DISTINCT user_id) AS active_users
FROM 
    Activity
WHERE 
    activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29 DAY) AND '2019-07-27'
GROUP BY 
    activity_date
ORDER BY 
    activity_date;

3.获取1-180天注册活跃留存表

现有一个用户活跃表user_active、用户注册表user_regist,

用户字段均为user_id;

设计一张1-180天注册活跃留存表包括以下字段

regist_date -- 注册日期
date_diff     -- 日期差
rate  -- 留存率(从注册日期起往后180天内注册用户里的活跃用户数/注册日期当天注册的用户总数)

用户注册表 (user_regist):

user_idregist_date
12021-01-01
22021-01-02
32021-01-03

用户活跃表 (user_active):

user_idactive_date
12021-01-02
12021-01-10
22021-01-03
32021-01-03
32021-01-04
32021-02-02
-- 定义包含总分和用户排名的CTE(公共表表达式)
WITH TotalScore AS (
    -- 计算每个用户的注册日期及注册总数
    SELECT 
        user_id,  -- 用户ID
        regist_date,  -- 注册日期
        COUNT(*) OVER (PARTITION BY regist_date) AS regist_count  -- 计算每个注册日期的用户数
    FROM 
        user_regist  -- 注册表
    WHERE 
        dt >= DATE_SUB(current_date(), 180)  -- 只考虑过去180天内的数据
), 
RandTotalScore AS (
    -- 对每个用户的活跃日期和注册日期计算日期差并统计用户数
    SELECT 
        t1.regist_date,  -- 注册日期
        t1.regist_count,  --  当前日期的总注册用户
        DATEDIFF(t2.active_date, t1.regist_date) AS date_diff,  -- 计算活跃日期与注册日期的日期差
        COUNT(*) AS user_count  -- 统计每个日期差的用户总数
    FROM 
        TotalScore t1  -- 引用先前计算的注册信息
    LEFT JOIN 
        (   -- 子查询:选择活跃用户及其活跃日期
            SELECT 
                user_id,  -- 用户ID
                to_date(active_date) as active_date  -- 活跃日期转换为日期格式
            FROM 
                user_active  -- 活跃表
            GROUP BY 
                user_id, to_date(active_date)  -- 按用户和活跃日期分组以避免重复
        ) t2 ON t1.user_id = t2.user_id  -- 将注册表与活跃表连接
    WHERE 
        DATEDIFF(t2.active_date, t1.regist_date) BETWEEN 1 AND 180  -- 筛选日期差在1到180天之间的数据
    GROUP BY 
        t1.regist_date, DATEDIFF(t2.active_date, t1.regist_date)  -- 按注册日期和日期差分组
)

-- 选择最终的结果集,包括日期差、用户数和留存率
SELECT 
    regist_date,  -- 注册日期
    date_diff,  -- 日期差
    user_count / regist_count AS rate  -- 计算留存率
FROM 
    RandTotalScore;  -- 引用计算好的活跃信息

4.学生名次统计

1)找出语数英每门课前三名的学生

2)单科分数有低于80分的学生的总分排名

1). 每门课前三名的学生 

SELECT name, lesson, goal
FROM (
    SELECT name, lesson, goal,
           RANK() OVER (PARTITION BY lesson ORDER BY goal DESC) as rank
    FROM scores
) ranked
WHERE rank <= 3;

2). 单科分数有低于80分的学生的总分排名

-- 首先,创建一个子查询或公共表表达式 (CTE),以获取得分低于80分的学生名单
WITH LowScorers AS (
    SELECT DISTINCT name
    FROM scores
    WHERE goal < 80
)

-- 接下来,使用此子查询来计算这些学生的总分,并对其进行排名
SELECT 
    name,
    SUM(goal) AS total_score,
    RANK() OVER (ORDER BY SUM(goal) DESC) as rank
FROM 
    scores
WHERE 
    name IN (SELECT name FROM LowScorers)
GROUP BY 
    name
ORDER BY 
    total_score DESC;

5.最近连续3周连续活跃用户数

源表dws_uv_detail示例数据

mid_iddtwk_dt
10012019-02-062019-02-04_2019-02-10
10012019-02-072019-02-04_2019-02-10
10012019-02-082019-02-04_2019-02-10
10012019-02-092019-02-04_2019-02-10
10012019-02-102019-02-04_2019-02-10
10012019-02-112019-02-11_2019-02-17
10022019-02-122019-02-11_2019-02-17
10032019-02-102019-02-04_2019-02-10
10042019-02-092019-02-04_2019-02-10
10042019-02-102019-02-04_2019-02-10
10042019-02-112019-02-11_2019-02-17
10042019-02-122019-02-11_2019-02-17
10052019-02-082019-02-04_2019-02-10
10052019-02-092019-02-04_2019-02-10
10052019-02-102019-02-04_2019-02-10

目标表ads_continuity_wk_count示例数据

dt                 wk_dt                               continuity_count
2019-02-12  2019-02-06_2019-02-12156
2019-02-132019-02-07_2019-02-13162
2019-02-142019-02-08_2019-02-14170
create table ads_continuity_wk_count(

   dt string COMMENT      '统计日期,一般用结束周周日日期,如果每天计算一次,可用当天日期',
   wk_dtstring COMMENT '持续时间',
   continuity_count bigint   '最近3周的活跃总次数'

) 
with dws_uv_detail_convert as(
    select mid_id,wk_dt
    from dws_uv_detail
    where wk_dt>=concat(date_add(next_day(CURRENT_DATE, 'MO'), -7*3), '_', date_add(next_day(CURRENT_DATE, 'MO'), -7*2-1))
    and wk_dt<=concat(date_add(next_day(CURRENT_DATE, 'MO'), -7), '_', date_add(next_day(CURRENT_DATE, 'MO'), -1))
    group by mid_id,wk_dt
)

select
  CURRENT_DATE,
    concat(date_add(next_day(CURRENT_DATE, 'MO'), -7*3), '_', date_add(next_day(CURRENT_DATE, 'MO'), -1)),
 wk_dt,
  count(*) continuity_count
from
(
  select mid_id
  from dws_uv_detail_wk_convert
  group by mid_id
  having count(*) = 3
) t1;

 where wk_dt>=concat(date_add(next_day(CURRENT_DATE, 'MO'), -7*3), '_', date_add(next_day(CURRENT_DATE, 'MO'), -7*2-1))
    and wk_dt<=concat(date_add(next_day(CURRENT_DATE, 'MO'), -7), '_', date_add(next_day(CURRENT_DATE, 'MO'), -1))

next_day(CURRENT_DATE, 'MO') 的含义是:

找到从当前日期(CURRENT_DATE)开始的下一个星期一(Monday)的日期。 

这个where条件筛选出了连续三周的数据。具体来说:

  • 第一周:从 3 周前的周一到 2 周前的周日
  • 第二周:从 2 周前的周一到 1 周前的周日
  • 第三周:从 1 周前的周一到本周的周日

concat确保生成的日期范围字符串格式与 wk_dt 列的格式一致,便于比较和匹配。

6.最近7天内连续3天活跃用户数 

源表dws_uv_detail和目标表ads_continuity_uv_count和题5保持一致

-- 创建目标表ads_continuity_uv_count
CREATE TABLE IF NOT EXISTS ads_continuity_uv_count (
    dt STRING COMMENT '统计日期',
    wk_dt STRING COMMENT '最近7天日期范围',
    continuity_count BIGINT COMMENT '连续3天活跃用户数'
) COMMENT '最近7天连续3天活跃用户数';

-- 插入数据到ads_continuity_uv_count表
INSERT OVERWRITE TABLE ads_continuity_uv_count
SELECT
    CURRENT_DATE AS dt,
    CONCAT(DATE_SUB(CURRENT_DATE, 6), '_', CURRENT_DATE)  wk_dt,
    COUNT(DISTINCT mid_id) AS continuity_count
FROM (
    SELECT
        mid_id
    FROM (
        SELECT
            mid_id,
            dt,
            DATE_SUB(dt, RANK() OVER (PARTITION BY mid_id ORDER BY dt)) AS date_group
        FROM dws_uv_detail
        WHERE dt BETWEEN DATE_SUB(CURRENT_DATE, 6) AND CURRENT_DATE
        -- 筛选最近7天的数据
    ) t1
    GROUP BY mid_id, date_group
    HAVING COUNT(*) >= 3
    -- 找出连续活跃3天及以上的用户
) t2;

-- 解释:
-- 1. 首先在WHERE子句中筛选出最近7天的数据。
-- 2. 使用窗口函数RANK()给每个用户的活跃日期进行排序。
-- 3. 用日期减去排名,得到date_group。连续的日期会得到相同的date_group值。
-- 4. 按mid_id和date_group分组,统计每组的记录数。记录数>=3的就是连续3天及以上活跃的用户。
-- 5. 最后统计符合条件的不同用户数量,即为连续3天活跃的用户数。
-- 6. CURRENT_DATE用于动态获取当前日期,使查询可以自动适应不同的执行日期。
-- 7. CONCAT(DATE_SUB(CURRENT_DATE, 6), '_', CURRENT_DATE) 生成最近7天的日期范围字符串。

7.餐馆营业额变化增长

Customer

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| customer_id   | int     |
| name          | varchar |
| visited_on    | date    |
| amount        | int     |
+---------------+---------+
在 SQL 中,(customer_id, visited_on) 是该表的主键。
该表包含一家餐馆的顾客交易数据。
visited_on 表示 (customer_id) 的顾客在 visited_on 那天访问了餐馆。
amount 是一个顾客某一天的消费总额。

你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。

计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。

结果按 visited_on 升序排序

WITH daily_totals AS (
    SELECT visited_on, SUM(amount) as daily_amount
    FROM Customer
    GROUP BY visited_on
),
rolling_window AS (
    SELECT 
        visited_on,
        SUM(daily_amount) OVER (
            ORDER BY visited_on
            ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
        ) as amount,
        AVG(daily_amount) OVER (
            ORDER BY visited_on
            ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
        ) as average_amount,
        ROW_NUMBER() OVER (ORDER BY visited_on) as row_num
    FROM daily_totals
)
SELECT 
    visited_on,
    amount,
    ROUND(average_amount, 2) as average_amount
FROM rolling_window
WHERE row_num >= 7
ORDER BY visited_on;


-- ORDER BY visited_on RANGE BETWEEN 6 PRECEDING AND CURRENT ROW 定义,意味着它将包括当前行的日期和之前6天的数据,从而确保每次计算都覆盖了7天的数据。


-- RDER BY visited_on  RANGE BETWEEN CURRENT ROW AND INTERVAL 6 DAY FOLLOWING当前行的日期和之后6天的数据,从而确保每次计算都覆盖了7天的数据
  • RANGE BETWEEN: 适用于处理连续的数值或日期范围,如时间序列数据。

这会计算当前行薪水前后1000范围内的薪水总和

SUM(salary) OVER (ORDER BY salary RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING)

  • ROWS BETWEEN: 适用于需要精确指定行数的情况,不考虑数值的连续性

这会计算当前行前后各2行的薪水总和。

SUM(salary) OVER (ORDER BY salary ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)

相关拓展

Hive SQL进阶:掌握间隔连续查询技巧,优化大数据分析(一)_hive查询结果中间无间隔-CSDN博客

17道Hive SQL经典训练提升题_15道hive sql经典训练提升题-CSDN博客

Hive SQL 五大经典面试题_hivesql面试题-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DC-7靶机渗透测试

DC-7靶机 DC: 7 ~ VulnHub 文章目录 DC-7靶机信息收集web渗透权限提升Drupal后台getshell权限提升靶机总结信息收集 经过扫描得到IP地址为192.168.78.154.其中开启了ssh和80端口,看来立足点就在于web渗透找到漏洞,获取用户密码来进行ssh连接进行寻找提权方案了使用dirb扫描…

Windows平台下内存泄漏检测工具Visual Leak detector介绍(vscode使用)

!!!此工具只能检测配合VC进行代码的内存泄漏检测 1、搜索VLD工具下载 2、配置环境变量 3、在main.cpp中加入#include<vld.h> 4、在CMakeLists.txt中添加 SET(VLD_PATH "xxx") # 链接vld静态库 target_link_libraries(${PROJECT_NAME} PRIVATE ${VLD_PATH})…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时&#xff0c;按下面步骤进行&#xff1…

antd-5版本table组件修改滚动条样式不生效问题

问题描述 在react项目中使用antd-ProComponents组件库的Protable组件时修改table自带的滚动条样式不生效。 排查记录 一般来说直接table组件库要自定义滚动条的样式&#xff0c;只需要修改 ant-table-body 的样式即可&#xff0c;代码如下&#xff1a; .ant-table-body {&am…

pikachu文件包含漏洞

一&#xff1a;漏洞基础 程序在引用文件的时&#xff0c;引用的文件名存在可控的情况&#xff0c;传入的文件名没有经过合理的校验或校验不严&#xff0c;从而操作了预想之外的文件&#xff0c;就有可能导致文件泄漏和恶意的代码注入&#xff1b; 文件包含漏洞概念 在PHP程序…

如果忘了Linux密码如何重置?

忘记密码是我们常会遇到的情况之一&#xff0c;无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。 忘记密码是我们常会遇到的情况之一&#xff0c;无论是在操作系统、网站账户、手机、电子邮件还是其他渠道上。有时候如果密码需要符合特定的复杂性要求&#xff0c;…

【C++题解】1023. 判断素数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1023. 判断素数 类型&#xff1a;函数&#xff0c;sqrt函数入门 题目描述&#xff1a; 任意输入一个整数&#xff0c;判断它是否为素数。是的话输出 T ,不是的话输出 F。 质数又称…

从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案

随着科技的飞速发展和社会的不断进步&#xff0c;视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域&#xff0c;EasyCVR视频汇聚平台凭借其强大的多协议接入能力&#xff0c;在复杂多变的网络环境中展现出了卓越的性能和广泛的应…

Android 12系统源码_多屏幕(一)多屏幕设备显示Activity

前言 分屏&#xff1a;是指一个屏幕分出多个窗口&#xff0c;分别显示不同应用的界面&#xff0c;这在当前的手机设备中很常见。多屏&#xff1a;是指一个设备存在多个屏幕&#xff0c;这些可能是虚拟屏幕或者实体硬件屏幕&#xff0c;不同的应用同时显示在不同的屏幕中&#…

全面解析:msvcp140_atomic_wait.dll 丢失的解决之道,助你轻松应对

在尝试解决“msvcp140_atomic_wait.dll丢失”的问题时&#xff0c;首先需要确认错误信息的准确性。用户应仔细检查在启动程序或执行特定操作时是否确实出现了这一错误提示。确认错误后&#xff0c;可以进一步采取措施来解决问题。这包括检查系统日志和错误报告&#xff0c;以确…

RK3562J技术分享 | 使用SPI挂载数字式RTD温度传感器的方法

MAX31865是简单易用的热敏电阻至数字输出转换器&#xff0c;优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度&#xff0c;高精度Δ-Σ ADC将RTD电阻与基准电阻之比转换为数字输出。MAX31865输入具有高达45V的过压保护&#xff0c;提供可配置的RTD及电缆开路、短路条件检…

如何避免或者减少线上空指针问题的发生

一、背景 在我们的日常工作中&#xff0c;我们会经常遇到空指针问题&#xff0c;理论上来说只是一个判段空指针的小问题&#xff0c;但是因为这行代码的报错&#xff0c;程序中断了后面的执行&#xff0c;可能导致整体业务逻辑受影响。那在工作中我们应该如何避免&#xff0c;…

layer.load 加倒计时

实现效果 loadinglayer.load(1, {content:"",shade: [0.7, #333],time:5000,success: function(layero,index) {var i 5;var timer null;var fn function() {// 显示的提示layero.find(".layui-layer-content").html(正在连接&#xff0c;请稍等&…

谷歌突然停止为应用程序生成胖APK 只提供AAB包可能会影响用户侧载安装

谷歌最初是在 2018 年开始准备 Android App Bundle (即 AAB) 安装包&#xff0c;到 2021 年这种格式已经成为默认格式&#xff0c;开发者在提交应用程序时需要将其构建为 AAB 格式方便 Google Play 应用商店分发。 AAB 格式的优势在于适用于不同屏幕尺寸、语言、CPU 架构和 An…

js基础与判断

1.加减乘除 2.逻辑运算符 4.分支 5.swicth switch与if-else区别 6.break和continue

Python list加了类型推断运行报错,TypeError: ‘type‘ object is not subscriptable,python3.7

问题描述&#xff1a; 在python3.7 版本 运行代码&#xff0c;报错 def retry( ignore_exception_type_info_list:list[IgnoreExceptionInfo]None):>>> TypeError: type object is not subscriptable解决方案&#xff1a; 去掉list内的参数推断,就正常了&#xff0…

Linux 操作系统速通

一、安装虚拟机 1. VmWare 安装下载 vmware workstation pro 16 下载 win R 输入 ncpa.cpl 确保网卡正常 2. CentOS 系统下载 CentOS 系统下载 将 CentOS 系统安装到虚拟机 3. 查看虚拟机 IP 命令 ifconfig 4. finalShell 安装下载 finalShell 下载 输入用户名一般是 ro…

高标准农田监测设备—农田环境的实时监测和精准管理

TH-Q3高标准农田监测设备是现代农业生产中不可或缺的重要工具&#xff0c;它们通过集成物联网、大数据、人工智能等先进技术&#xff0c;实现了对农田环境的实时监测和精准管理。以下是对高标准农田监测设备的详细介绍&#xff1a; 设备组成 高标准农田监测设备通常由多个子系统…

出现 No mapping for DELETE/GET等

出现 No mapping for DELETE/GET等 错误一&#xff1a;请求url不对 修改前 如下图可知后端请求url为http://localhost:8080/user/addressBook 运行后控制台出现 发现后端请求url比前端请求url少了/ 改正&#xff1a; 在DeleteMapping后面加上 / DeleteMapping("/&quo…

欧科云链对话香港大学、零壹智库:监管加速,市场增长何时就位?

香港Web3行业近期在广泛讨论一个话题——稳定币。它是虚拟资产和Web3市场的重要分支&#xff0c;也是连接传统金融与虚拟资产市场重要的“桥梁”。随着全球Web3 合规进程加速&#xff0c;各国也在积极推进本土稳定币监管及发展&#xff0c;稳定币市场格局正在迎来变革。近日&am…