沐数科技数据开发岗笔试题2025

news2025/3/17 4:24:05

描述性统计

标准差 

答案: A

解析:

标准差

衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值(均值)之间的偏离程度。标准差越大,表明数据的分布越分散;标准差越小,表明数据越集中

标准差的取值范围是[0, +∞)

标准差是方差的平方根

在有限的数据集中,标准差不可能大于数据集中的最大值与最小值之差的一半

均值, 即平均值 

正态分布

也被称为高斯分布(Gaussian distribution)

特征

  1. 对称性:正态分布曲线关于均值对称,均值所在的垂直线将曲线分为两个镜像部分。

  2. 钟形曲线:分布曲线呈现为钟形,均值处达到最高点,向两侧逐渐降低。

  3. 均值、中位数和众数相等:在正态分布中,均值(平均值)、中位数(数据中间值)和众数(出现次数最多的值)是相等的。

  4. 68-95-99.7规则:在正态分布中,大约68%的数据值落在距离均值一个标准差的范围内,约95%的数据值落在两个标准差的范围内,而约99.7%的数据值落在三个标准差的范围内。

中位数

答案: B 

解析:

A. 所有数据的平均值,  是所有数据值加起来除以数据个数得到的值。

C. 最小值和最大值的平均值, 这通常被称为数据集的中点(Midrange)

D. 数据按降序排列后的第一个值, 这个值实际上是数据集的最大值(Maximum)

数据探查

数据清洗 

答案: C

解析:

数据清洗的步骤

检查缺失值和异常值>>数据格式化>>数据合并>>生成报告

检查数据分布

答案: B

解析:

A. 折线图(Line Chart)

  • 用于展示数据随时间或有序类别变化的趋势。

  • 适合展示连续数据和时间序列数据的变化情况。

  • 可以清晰地显示数据的增减变化和预测未来的趋势。

B. 直方图(Histogram)

  • 用于展示数据分布的情况。

  • 通过将数据分成若干个区间(bins),展示每个区间内数据的频率或数量。

  • 适合检查数据的分布形态,如是否接近正态分布,以及数据的集中趋势和离散程度。

C. 散点图(Scatter Plot)

  • 用于展示两个变量之间的关系。

  • 通过在二维平面上绘制点,可以观察两个变量之间是否存在相关性。

  • 适合探索变量之间的相关性、趋势和模式。

D. 热力图(Heatmap)

  • 用颜色变化来展示矩阵或表格中数据的大小。

  • 适合展示两个类别变量之间的关系,如时间序列数据的周期性变化。

  • 常用于展示数据的密度或强度,如地理热力图、用户行为热力图等。

主键

答案: A

解析:

主键约束: 唯一且非空

主键

答案: A

解析:

A.  

  1. 业务逻辑错误:逻辑主键用于确保数据的一致性和准确性。如果主键不唯一,可能会插入重复的记录,导致业务逻辑错误。

  2. 数据扩散:在数据扩散(Data Replication)过程中,如果主键不唯一,可能会导致数据不一致,因为相同的主键值可能会被复制到多个位置。

  3. 数据不一致:由于重复的主键值,可能会导致数据更新或删除操作影响到错误的记录,从而造成数据不一致。

数据扩散(Data Replication)是将数据从一个位置复制到另一个位置的过程,以确保数据的可用性、冗余和容错性

B.  主键不唯一  可能因为重复值导致索引效率降低。

C. 主键不唯一,查询操作仍然可以关联到数据,只是可能会关联到多条记录,而不是预期的单条记录。

D. 相反,主键的定义就是为了确保唯一性,如果违反了这一约束,数据库通常会报错,需要手动干预来解决重复主键的问题。

连续型变量

答案: D

解析: 

连续型变量(Continuous Variable)是指可以在无限或有限的区间内取任意值的变量。

离散型变量(Discrete Variable)只能取有限个或可数无限个值,如人数、车辆数、产品数量等

连续型变量的离群点(Outliers)是指在数据集中与其他数据点明显不同或者异常的数据点。这些数据点可能比其他数据点要远离数据集的中心,或者具有异常的数值。离群点可能是由于数据采集错误、异常事件、测量误差或者其他未知因素引起的。离群点的存在可以对数据分析和统计建模产生重要影响,因为它们可能导致模型不准确或者产生误导性的结果。

数据缺失值

答案: B

解析:

A. 用前一天的数据填充缺失值

  • 这种方法假设数据在短期内是稳定的,前一天的数据可以作为当天数据的合理代理。这种方法简单易行,但可能不适用于数据波动较大的情况

B. 检查缺失值是否集中在特定的时间段

  • 通过检查缺失值的分布,可以了解数据缺失是否具有某种模式。例如,如果缺失值集中在特定的时间段,可能表明数据收集过程中存在系统性问题,如设备故障或节假日效应。这种方法有助于识别数据缺失的原因,从而采取更有针对性的处理措施。

C. 删除所有包含缺失值的日期

  • 删除包含缺失值的日期可以简化分析,但可能会导致信息损失,特别是如果缺失值较多时。这种方法适用于缺失值较少且删除后不会对分析结果产生显著影响的情况。

D. 插值法填充所有缺失值

  • 插值法(如线性插值、多项式插值等)通过使用数据集中的其他数据点来估计缺失值。这种方法可以保留更多的数据信息,但插值的准确性依赖于数据的分布和趋势。插值可能不适用于缺失值较多或缺失模式不规则的情况。

线性差值: 如果两个已知数据点之间的数据变化是线性的,即在这两个点之间,数据的变化率是恒定的。 

多项式插值: 使用一个多项式函数来通过所有已知的数据点。这种方法可以提供比线性插值更复杂的数据模型,适用于数据变化更复杂的情况。

业务

10.实操题

销售订单表

订单明细表

【备注】 - ​业务主键(Business Key)​:指在业务逻辑中唯一标识一条记录的字段或字段组合。与数据库中的主键(Primary Key)​有所不同,业务主键(Business Key)​是业务层面的唯一标识,通常由业务规则决定,例如,订单号、订单明细号,身份证号等

【问题】 仅基于这份数据,以下哪些说法正确?(多选)

A. order 表的业务主键存在空值缺失情况

B. order 表的数据时间范围为 从 2009 ~ 2012 年的订单数据

C. order_detail 缺少一个明确的业务主键字段,但是存在业务主键字段组合(order_id + product_id)

D. 华北区中,订单最多的客户(customer)是 SAVEA,Owner 都是 苏先生,一共有16笔订单

E. 一共有77个产品,都有被卖出去;其中单价最高的是 绿茶,其单价为 263.5

答案: A, C, D, E

解析:

B. order 表显示的订单日期从 2010/8/12 开始,一直到 2010/10/8 结束

沐数一下

答案: B、C、D、G、H

解析:

选项 A 提供数据存储服务,通常不是探查报告的直接功能,而是数据管理系统或数据库的角色。

沐数一下

答案: B, C, D

解析:

A 存储数据表的所有数据,通常不是探查报告的直接功能,而是数据库或数据存储系统的角色。

E 对数据表中的值进行清洗和标准化,虽然探查报告可能提供一些数据清洗和标准化的指导,但直接进行这些操作通常需要其他工具或过程。

沐数一下

答案: A, B, C, D, E 

SQL

解析实操题: 

SELECT 
    s.country,
    p.product_id,
    p.product_name,
    SUM(s.amount) AS total_sales
FROM 
    sales s
JOIN 
    products p ON s.product_id = p.product_id
WHERE 
    s.country IN ('法国', '英国')
    AND s.sale_date BETWEEN '2020-09-01' AND '2020-09-30'
GROUP BY 
    s.country,
    p.product_id,
    p.product_name
ORDER BY 
    s.country,
    p.product_id;

输出示例

解析填空题

SELECT 
    p.product_name,
    ROUND(SUM(s.amount), 0) AS total_sales
FROM 
    sales s
JOIN 
    products p ON s.product_id = p.product_id
WHERE 
    s.country = '英国'
    AND s.sale_date BETWEEN '2020-09-01' AND '2020-09-30'
GROUP BY 
    p.product_name
ORDER BY 
    total_sales DESC
FETCH FIRST 1 ROW ONLY;

解析: 

实操题

SELECT 
    s.country,
    SUM(s.amount) AS total_sales,
    CASE 
        WHEN SUM(s.amount) > 10000 THEN '合格'
        ELSE '不合格'
    END AS performance
FROM 
    sales s
GROUP BY 
    s.country
ORDER BY 
    s.country;

 填空题

SELECT 
    s.country,
    ROUND(SUM(s.amount), 0) AS total_sales
FROM 
    sales s
GROUP BY 
    s.country
ORDER BY 
    total_sales DESC
FETCH FIRST 1 ROW ONLY;

解析: 

实操题

SELECT
    p.product_name AS "产品名称",
    SUM(s.sales_amount) AS "销售金额",
    ROUND(SUM(s.sales_amount) / total_sales.total_amount * 100, 2) AS "占比"
FROM
    sales s
JOIN
    products p ON s.product_id = p.product_id
CROSS JOIN
    (SELECT SUM(sales_amount) AS total_amount FROM sales) total_sales
GROUP BY
    p.product_name, total_sales.total_amount
HAVING
    ROUND(SUM(s.sales_amount) / total_sales.total_amount * 100, 2) >= 10
ORDER BY
    "占比" DESC;

CROSS JOIN 的作用是将 sales 表中的每一行与 total_sales 子查询的结果(即总销售金额)进行笛卡尔积连接。这意味着每一行 sales 数据都会与 total_sales 中的总金额进行组合,从而使得每一行都可以访问总销售金额。

填空题

WITH ProductSales AS (
    SELECT
        p.product_name,
        SUM(s.sales_amount) AS total_sales_amount,
        ROUND(SUM(s.sales_amount) / total_sales.total_amount * 100, 2) AS sales_percentage
    FROM
        sales s
    JOIN
        products p ON s.product_id = p.product_id
    CROSS JOIN
        (SELECT SUM(sales_amount) AS total_amount FROM sales) total_sales
    GROUP BY
        p.product_name, total_sales.total_amount
    HAVING
        ROUND(SUM(s.sales_amount) / total_sales.total_amount * 100, 2) >= 10
),
RankedProducts AS (
    SELECT
        sales_percentage,
        DENSE_RANK() OVER (ORDER BY sales_percentage DESC) AS rank
    FROM
        ProductSales
)
SELECT
    COUNT(*) AS product_count,
    MAX(CASE WHEN rank = 3 THEN sales_percentage END) AS third_largest_percentage
FROM
    RankedProducts;

解析: 

实操题

SELECT 
    CASE 
        WHEN age < 25 THEN '25岁以下'
        WHEN age >= 25 AND age < 30 THEN '25-30岁'
        WHEN age >= 30 AND age < 35 THEN '30-35岁'
        WHEN age >= 35 AND age < 40 THEN '35-40岁'
        WHEN age >= 40 AND age < 45 THEN '40-45岁'
        WHEN age >= 45 AND age < 50 THEN '45-50岁'
        WHEN age >= 50 AND age < 55 THEN '50-55岁'
        WHEN age >= 55 THEN '55岁及以上'
        ELSE '异常情况'
    END AS age_group,
    COUNT(*) AS num_employees
FROM employees
WHERE age IS NOT NULL AND age > 0
GROUP BY 
    CASE 
        WHEN age < 25 THEN '25岁以下'
        WHEN age >= 25 AND age < 30 THEN '25-30岁'
        WHEN age >= 30 AND age < 35 THEN '30-35岁'
        WHEN age >= 35 AND age < 40 THEN '35-40岁'
        WHEN age >= 40 AND age < 45 THEN '40-45岁'
        WHEN age >= 45 AND age < 50 THEN '45-50岁'
        WHEN age >= 50 AND age < 55 THEN '50-55岁'
        WHEN age >= 55 THEN '55岁及以上'
        ELSE '异常情况'
    END
ORDER BY 
    CASE 
        WHEN age_group = '25岁以下' THEN 1
        WHEN age_group = '25-30岁' THEN 2
        WHEN age_group = '30-35岁' THEN 3
        WHEN age_group = '35-40岁' THEN 4
        WHEN age_group = '40-45岁' THEN 5
        WHEN age_group = '45-50岁' THEN 6
        WHEN age_group = '50-55岁' THEN 7
        WHEN age_group = '55岁及以上' THEN 8
        ELSE 9
    END;

填空题

WITH AgeDistribution AS (
    SELECT 
        CASE 
            WHEN age < 25 THEN '25岁以下'
            WHEN age >= 25 AND age < 30 THEN '25-30岁'
            WHEN age >= 30 AND age < 35 THEN '30-35岁'
            WHEN age >= 35 AND age < 40 THEN '35-40岁'
            WHEN age >= 40 AND age < 45 THEN '40-45岁'
            WHEN age >= 45 AND age < 50 THEN '45-50岁'
            WHEN age >= 50 AND age < 55 THEN '50-55岁'
            WHEN age >= 55 THEN '55岁及以上'
            ELSE '异常情况'
        END AS age_group,
        COUNT(*) AS num_employees
    FROM employees
    WHERE age IS NOT NULL AND age > 0
    GROUP BY 
        CASE 
            WHEN age < 25 THEN '25岁以下'
            WHEN age >= 25 AND age < 30 THEN '25-30岁'
            WHEN age >= 30 AND age < 35 THEN '30-35岁'
            WHEN age >= 35 AND age < 40 THEN '35-40岁'
            WHEN age >= 40 AND age < 45 THEN '40-45岁'
            WHEN age >= 45 AND age < 50 THEN '45-50岁'
            WHEN age >= 50 AND age < 55 THEN '50-55岁'
            WHEN age >= 55 THEN '55岁及以上'
            ELSE '异常情况'
        END
),
Ranking AS (
    SELECT age_group, num_employees,
           RANK() OVER (ORDER BY num_employees DESC) AS rank
    FROM AgeDistribution
)
SELECT 
    age_group,
    num_employees
FROM Ranking
WHERE rank = 2;

SELECT COUNT(*) AS num异常
FROM employees
WHERE age IS NULL OR age <= 0;

SELECT 
    reason,
    COUNT(*) AS num_people,
    RANK() OVER (ORDER BY COUNT(*) DESC) AS ranking
FROM new_hires
GROUP BY reason
ORDER BY ranking;

填空题

SELECT reason, COUNT(*) AS num_people
FROM new_hires
GROUP BY reason
ORDER BY COUNT(*) DESC
FETCH FIRST 1 ROW ONLY OFFSET 3 ROWS;

解析: 

实操题

SELECT
    YEAR(resignation_date) AS resignation_year,
    COUNT(employee_id) AS num_resignations,
    SUM(COUNT(employee_id)) OVER (ORDER BY YEAR(resignation_date)) AS cumulative_resignations
FROM employee_resignations
GROUP BY YEAR(resignation_date)
ORDER BY resignation_year;

窗口函数 SUM(...) OVER (...) 的行为。它不是在对整个结果集进行求和,而是在对结果集的每个分组(由 GROUP BY 定义)进行求和。

OVER (ORDER BY YEAR(resignation_date)) 定义了窗口函数的操作范围,即按照 resignation_date 的年份进行排序

 填空题

WITH ResignationStats AS (
    SELECT
        YEAR(resignation_date) AS resignation_year,
        COUNT(employee_id) AS num_resignations,
        SUM(COUNT(employee_id)) OVER (ORDER BY YEAR(resignation_date)) AS cumulative_resignations
    FROM employee_resignations
    GROUP BY YEAR(resignation_date)
)
SELECT 
    resignation_year,
    num_resignations
FROM ResignationStats
WHERE cumulative_resignations > 100
ORDER BY resignation_year
FETCH FIRST 1 ROW ONLY;

解析:

实操题

SELECT 
    AVG(CASE WHEN class = 'Class1' THEN score ELSE NULL END) AS class1_avg,
    AVG(CASE WHEN class = 'Class2' THEN score ELSE NULL END) AS class2_avg,
    AVG(CASE WHEN class = 'Class1' THEN score ELSE NULL END) 
    - AVG(CASE WHEN class = 'Class2' THEN score ELSE NULL END) AS difference
FROM 
    scores
WHERE 
    course = 'data_visualization';

填空题

SELECT 
    ROUND(AVG(CASE WHEN class = 'Class1' THEN score ELSE NULL END) 
    - AVG(CASE WHEN class = 'Class2' THEN score ELSE NULL END), 2) AS difference
FROM 
    scores
WHERE 
    course = 'data_visualization';

解析: 

实操题

Oracle 12c及更高版本支持FILTER子句, 用于在聚合函数中过滤数据

SELECT 
    class,
    AVG(score) OVER (PARTITION BY class) AS avg_score,
    COUNT(*) FILTER (WHERE score < AVG(score) OVER (PARTITION BY class)) 
    AS below_avg_count
FROM 
    scores
WHERE 
    course = 'sql'
GROUP BY 
    class;

 Oracle 12c版本以下>>使用子查询和CASE语句来实现相同的功能

SELECT 
    class,
    AVG(score) AS avg_score,
    (SELECT COUNT(*) FROM scores s2 WHERE s2.class = s.class 
    AND s2.score < s.avg_score) AS below_avg_count
FROM 
    scores s
WHERE 
    s.course = 'sql'
GROUP BY 
    class;

子查询中的 s2.class = s.class 确保了子查询只考虑与外部查询中当前处理的班级相同的记录。换句话说,对于每个班级,子查询都会计算该班级中成绩低于班级平均分的学生人数。

填空题

SELECT 
    class,
    AVG(score) AS avg_score,
    COUNT(*) FILTER (WHERE score < AVG(score) OVER (PARTITION BY class)) 
    AS below_avg_count
FROM 
    scores
WHERE 
    course = 'sql'
GROUP BY 
    class
ORDER BY 
    avg_score ASC
FETCH FIRST 1 ROW ONLY;

解析

实操题思路

使用两个CTE表达式>>计算出每月销售额; 计算去年同月的销售额, 计算上个月的销售额

主查询>>计算同比增长率, 环比增长率, 提取需要的字段

数据范围

  • 确保 sales_data 表中包含2019年和2020年的数据,否则同比计算可能不准确

WITH MonthlySales AS (
    -- 假设原始数据表为 sales_data, 包含 sale_date 和 amount 字段
    SELECT
        TO_CHAR(sale_date, 'YYYY') AS sale_year,
        TO_CHAR(sale_date, 'MM') AS sale_month,
        SUM(amount) AS total_sales
    FROM sales_data
    WHERE sale_date >= TO_DATE('2019-01-01', 'YYYY-MM-DD')  -- 包含2019年数据
      AND sale_date < TO_DATE('2021-01-01', 'YYYY-MM-DD')   -- 包含2020年数据
    GROUP BY TO_CHAR(sale_date, 'YYYY'), TO_CHAR(sale_date, 'MM')
),
CTE AS (
    SELECT
        sale_year,
        sale_month,
        total_sales,
        LAG(total_sales, 12) OVER (ORDER BY sale_year, sale_month) AS prev_year_sales, 
        -- 去年同月销售额
        LAG(total_sales, 1) OVER (ORDER BY sale_year, sale_month) AS prev_month_sales  
        -- 上月销售额
    FROM MonthlySales
)
SELECT
    sale_year AS 年份,
    sale_month AS 月份,
    total_sales AS 销售额,
    -- 计算同比增长率
    CASE
        WHEN prev_year_sales IS NOT NULL AND prev_year_sales <> 0 THEN
            (total_sales - prev_year_sales) / prev_year_sales
        ELSE
            NULL
    END AS 同比,
    -- 计算环比增长率
    CASE
        WHEN prev_month_sales IS NOT NULL AND prev_month_sales <> 0 THEN
            (total_sales - prev_month_sales) / prev_month_sales
        ELSE
            NULL
    END AS 环比
FROM CTE
WHERE sale_year = '2020'  -- 只输出2020年的结果
ORDER BY sale_year, sale_month;

填空题

在主查询的where过滤条件增加月份的过滤, 注意格式>>round, to_char(number, format)

WITH MonthlySales AS (
    -- 假设原始数据表为 sales_data, 包含 sale_date 和 amount 字段
    SELECT
        TO_CHAR(sale_date, 'YYYY') AS sale_year,
        TO_CHAR(sale_date, 'MM') AS sale_month,
        SUM(amount) AS total_sales
    FROM sales_data
    WHERE sale_date >= TO_DATE('2019-01-01', 'YYYY-MM-DD')  -- 包含2019年数据
      AND sale_date < TO_DATE('2021-01-01', 'YYYY-MM-DD')   -- 包含2020年数据
    GROUP BY TO_CHAR(sale_date, 'YYYY'), TO_CHAR(sale_date, 'MM')
),
CTE AS (
    SELECT
        sale_year,
        sale_month,
        total_sales,
        LAG(total_sales, 12) OVER (ORDER BY sale_year, sale_month) AS prev_year_sales, 
        -- 去年同月销售额
        LAG(total_sales, 1) OVER (ORDER BY sale_year, sale_month) AS prev_month_sales  
        -- 上月销售额
    FROM MonthlySales
)
SELECT
    ROUND(total_sales) AS 销售额,  -- 四舍五入到整数
    TO_CHAR(
        CASE
            WHEN prev_year_sales IS NOT NULL AND prev_year_sales <> 0 THEN
                (total_sales - prev_year_sales) / prev_year_sales * 100
            ELSE
                NULL
        END, '999.99') || '%' AS 同比,  -- 同比增长率,保留2位小数百分比
    TO_CHAR(
        CASE
            WHEN prev_month_sales IS NOT NULL AND prev_month_sales <> 0 THEN
                (total_sales - prev_month_sales) / prev_month_sales * 100
            ELSE
                NULL
        END, '999.99') || '%' AS 环比  -- 环比增长率,保留2位小数百分比
FROM CTE
WHERE sale_year = '2020' AND sale_month = '09';  -- 只查询2020年9月的数据

 

解析

实操题

WITH RankedResults AS (
    SELECT
        employee_id,
        employee_name,
        statistics,
        sql_score,
        python,
        data_visualization,
        mathematics,
        exam_date,
        (statistics + sql_score + python + data_visualization + mathematics) 
        AS total_score,
        CASE
            WHEN statistics >= 60 AND sql_score >= 60 AND python >= 60 
                AND data_visualization >= 60 AND total_score >= 300 THEN 'pass'
            ELSE 'fail'
        END AS final_result,
        ROW_NUMBER() OVER (PARTITION BY employee_id, final_result 
                            ORDER BY total_score DESC) AS rn
    FROM exam_results
)
SELECT
    employee_id AS 员工ID,
    employee_name AS 人员姓名,
    statistics AS statistics得分,
    sql_score AS SQL得分,
    python AS python得分,
    data_visualization AS data_visualization得分,
    mathematics AS mathematics得分,
    total_score AS 总分,
    exam_date AS 考核时间,
    final_result AS 最终考核结果
FROM RankedResults
WHERE rn = 1  -- 取每个员工通过或未通过中总分最高的记录
ORDER BY employee_id;

填空题

解析

实操题

SELECT 
    ec.COUNTRY AS 国家,
    ep.PRODUCTID AS 产品ID,
    ep.PRODUCTNAME AS 产品名称,
    SUM(ep.PRICE * eo.SALE_AMOUNT) AS 销售金额
FROM 
    e_product ep
LEFT JOIN e_order eo ON ep.PRODUCTID = eo.PRODUCTID
LEFT JOIN e_customer ec ON eo.CUSTOMID = ec.CUSTOMID
WHERE 
    SUBSTR(eo.ZTIME, 1, 7) = '2020-09'
    AND ec.COUNTRY IN ('法国', '英国')
GROUP BY 
    ec.COUNTRY, ep.PRODUCTID, ep.PRODUCTNAME
ORDER BY 
    ec.COUNTRY, ep.PRODUCTID;

填空题

SELECT 
    ep.PRODUCTNAME AS 产品名称,
    ROUND(SUM(ep.PRICE * eo.SALE_AMOUNT)) AS 销售金额
FROM 
    e_customer ec
JOIN e_order eo ON ec.CUSTOMID = eo.CUSTOMID
JOIN e_product ep ON eo.PRODUCTID = ep.PRODUCTID
WHERE 
    ec.COUNTRY = '英国'
    AND TO_CHAR(eo.ZTIME, 'YYYY-MM') = '2020-09'
GROUP BY 
    ep.PRODUCTNAME
ORDER BY 
    SUM(ep.PRICE * eo.SALE_AMOUNT) DESC
FETCH FIRST 1 ROW ONLY;

SELECT 
    DATE(t1.register_time_bj) AS stat_date,  -- 将登录时间转换为日期格式,作为统计日期
    t1.channel,  -- 用户登录的渠道
    COUNT(DISTINCT CASE 
        WHEN t2.credit_submit_time_local BETWEEN t1.register_time_bj AND DATE_ADD(t1.register_time_bj, INTERVAL 3 DAY) 
        THEN t1.uid 
    END) AS credit_submit_cnt,  -- 计算在用户登录后3天内提交授信申请的用户数量
    COUNT(DISTINCT CASE 
        WHEN t2.credit_submit_time_local BETWEEN t1.register_time_bj AND DATE_ADD(t1.register_time_bj, INTERVAL 3 DAY) 
        AND t2.credit_status = 'success' 
        THEN t1.uid 
    END) AS credit_succ_cnt  -- 计算在用户登录后3天内成功授信的用户数量
FROM 
    table_register t1
LEFT JOIN 
    table_credit t2 ON t1.uid = t2.uid  -- 通过用户ID连接两个表
WHERE 
    DATE(t1.register_time_bj) >= DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)  -- 筛选最近一个月的数据
GROUP BY 
    DATE(t1.register_time_bj), t1.channel  -- 按日期和渠道聚合
ORDER BY 
    stat_date, t1.channel;  -- 按日期和渠道排序

. 确定数据来源和字段
用户登录表(table_register):包含用户ID(uid)、登录时间(register_time_bj)、渠道(channel)。
用户授信表(table_credit):包含用户ID(uid)、授信申请时间(credit_submit_time_local)、授信状态(credit_status)。
2. 确定时间范围
使用DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)来获取当前日期前一个月的日期,确保只统计最近一个月的数据。
3. 连接两个表
使用LEFT JOIN连接table_register和table_credit表,通过uid字段连接。这样可以确保即使某些用户没有授信记录,也能在结果中显示他们的登录信息。
4. 筛选符合条件的记录
使用WHERE子句筛选出登录时间在最近一个月内的记录。
5. 计算授信申请和成功授信的用户数量
使用COUNT(DISTINCT CASE WHEN ... THEN ... END)结构来计算:
授信申请用户数量(credit_submit_cnt):计算在用户登录后3天内提交授信申请的用户数量。
成功授信用户数量(credit_succ_cnt):计算在用户登录后3天内成功授信的用户数量。
6. 聚合和排序结果
使用GROUP BY子句按日期和渠道对结果进行聚合。
使用ORDER BY子句按日期和渠道对结果进行排序。

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

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

相关文章

【eNSP实战】配置Easy IP

拓图 要求&#xff1a; 在AR1配置Easy IP策略实现内网可以访问Internet主机IP如图所示&#xff0c;这里不做展示 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.0.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 10.0.1.1 255.255.255.0 …

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…

Oracle VirtualBox安装CentOS 7

Oracle VirtualBox虚拟机安装CentOS 7 该文章记录了在Windows上使用Oracle公司&#xff08;甲骨文&#xff09;的Virtual Box安装CentOS 7的过程中&#xff0c;所遇到到的一些困难和解决方案。 目录 Oracle VirtualBox虚拟机安装CentOS 7一、前期准备工作1.Virtual Box2.Cent…

linux docker 安装dify本地运行,及部署后运行出现502问题

1、git 拉取代码:git&#xff08; https://github.com/langgenius/dify.git&#xff09; git clone https://github.com/langgenius/dify.git2、进入项目目录 的docker下 cd docker3、复制一份本地运行的环境 cp .\.env.example .env查看本地的端口&#xff1a;80和443端口…

计算机网络——DHCP

一、什么是DHCP&#xff1f; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是一种网络管理协议&#xff0c;用于自动分配IP地址、子网掩码、网关、DNS等网络参数给客户端设备。它像一个“智能管家”&#xff0c;让设备无需手…

基于Java+MySQL实现的医药销售管理系统

医药销售管理系统 开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称…

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …

Vue 中的 MVVM、MVC 和 MVP 模式深度解析

文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了&#xff0c;接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能&#xff0c;逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧&#xff01; 功能讲解 开发环境&#xf…

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …

Linux 下 MySQL 8 搭建教程

一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL&#xff1a; rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件&#xff1a; [roo…

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用

最新版VMware 17.6.3安装包分享

修复 Windows 11 主机无响应问题&#xff1a;Windows 11 主机锁定或解锁后&#xff0c;虚拟机可能变得无响应&#xff0c;此问题已在 17.6.3 版本中解决。 解决虚拟机启动崩溃问题&#xff1a;在某些系统上启动虚拟机后&#xff0c;Workstation Pro 可能会崩溃&#xff0c;新版…

Java高频面试之集合-12

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 的 hash 函数是怎么设计的? HashMap的hash函数设计核心在于减少碰撞、提高数据分布均匀性&#xff0c;具体实现…

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

【黑马点评|项目】万字总结(下)

文章上半部分&#xff1a; 【黑马点评|项目】万字总结&#xff08;上&#xff09; 优惠卷秒杀 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易出…

[数据结构]排序之 直接选择排序

1 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 数据元素排完 。 2 直接选择排序 : 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素…

前端工程化之前端工程化详解 包管理工具

前端工程化详解 & 包管理工具 前端工程化什么是前端工程化前端工程化发展脚手架能力 体验度量规范流程效能流程扭转 稳定性建设针对整体稳定性建设 可监控&#xff1a;前端监控系统 包管理工具npm包详解package.jsonname 模块名description 模块描述信息keywords&#xff1…