常用sql场景

用户连续交易天数与连续交易额,与各自对应的日期区间

1.合并当天有多笔交易的用户的交易数据
2.如果有交易额为0的情况,过滤交易额为0的记录
3.按用户分组,以日期降序排序,相减后可将连续日期归为一组

ds3.13.23.33.53.63.9
排序123456
相减2.282.282.283.13.13.3

4.根据相减的值与用户id,分组计算

SELECT  user_id
        ,drn
        ,continual_ds
        ,continual_ds_rank
        ,continual_amt
        ,continual_amt_rank
        ,begin_dt
        ,end_dt
FROM    (
        SELECT  user_id
                ,drn
                ,COUNT(ds) AS continual_ds
                ,ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY COUNT(ds) DESC,drn DESC) AS continual_ds_rank 
                ,ROUND(SUM(pay_amt),2) AS continual_amt
                ,ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY ROUND(SUM(pay_amt),2) DESC,drn DESC) AS continual_amt_rank 
                ,MIN(ds) AS begin_dt
                ,MAX(ds) AS end_dt
        FROM    (
                SELECT  user_id
                        ,ds
                        ,pay_amt
                        ,TO_CHAR(DATEADD(TO_DATE(ds,'yyyymmdd'),-ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY ds),'day'),'yyyymmdd') AS drn
                FROM    (
                        SELECT  user_id,ds,ROUND(SUM(pay_amt),2) AS pay_amt
                        FROM    lsk_cdm.dwd_lsk_trd_order_wide_di
                        WHERE   ds >= 20210201
                        and     ds <= 20210309
                        AND     is_valid_order = 1
                        GROUP BY user_id,ds
                ) t1
        ) t2
        GROUP BY user_id,drn
) t3
LIMIT 1000;

示例结果

用户分平台交易笔数,金额统计

查找每天 仅 使用手机端用户、仅 使用桌面端用户和 同时 使用桌面端和手机端的用户人数和总支出金额。
思路:1.按用户日期分组,将平台拼接,金额求和
2.处理平台,将在两个平台交易的情况,转换为both
在这里插入图片描述

select t3.platform,spend_date,count(1) AS total_users,SUM(amount) AS total_amount
from   (
        --mysql中将collect_set替换为group_concat,并提前对platform去重
		select id,spend_date,concat_ws(',',COLLECT_SET(platform)) AS platform,SUM(amount) AS amount
		from   spending_table
		group by id,spend_date
) t2
left join (
		select 'mobile' AS pid,'mobile' AS platform union all 
		select 'desktop' AS pid,'desktop' AS platform union all 
		select 'mobile,desktop' AS pid,'both' AS platform union all 
		select 'desktop,mobile' AS pid,'both' AS platform
) t3
ON t2.platform = t3.pid

在这里插入图片描述

公司薪水中位数

公司员工的薪水中位数
Employee 表有三列:员工Id(主键),公司名和薪水 【id,company,salary】
不使用任何内置的SQL函数的情况下,查找每个公司的薪水中位数(偶数返回2条,奇数返回1条)

1.full join获得同公司的薪水对比
2.以公司和薪水分组,求绝对值【求和(大于该薪水:+1,等于该薪水:+0,小于该薪水:-1)】,值为A
3.以公司和薪水分组,求该薪水的个数 B
4. B>=A,则该薪水为中位数

+-----+------------+--------+
|Id   | Company    | Salary |
+-----+------------+--------+
|1    | A          | 2341   |
|2    | A          | 341    |
|3    | A          | 15     |
|4    | A          | 15314  |
|5    | A          | 451    |
|6    | A          | 513    |
|7    | B          | 15     |
|8    | B          | 13     |
|9    | B          | 1154   |
|10   | B          | 1345   |
|11   | B          | 1221   |
|12   | B          | 234    |
|13   | C          | 2345   |
|14   | C          | 2645   |
|15   | C          | 2645   |
|16   | C          | 2652   |
|17   | C          | 65     |
+-----+------------+--------+
SELECT t1.id,t1.company,MAX(t1.salary) AS salary
FROM employee t1
LEFT JOIN employee t2
ON t1.company = t2.company
GROUP BY t1.company,t1.id
HAVING SUM(CASE WHEN t1.salary = t2.salary THEN 1 ELSE 0 END) >= ABS(SUM(SIGN(t1.salary - t2.salary)))
ORDER BY t1.id

示例输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数仓中常用SQL查询技巧有很多,以下是一些常见的技巧和建议: 1. 使用窗口函数:窗口函数(Window Function)是SQL中强大的功能之一,它可以在查询结果中对数据集进行分组、排序和聚合操作,常用的窗口函数包括RANK、ROW_NUMBER、LEAD、LAG等。 2. 优化查询性能:在处理大规模数据时,优化查询性能是非常重要的。可以通过创建合适的索引、避免全表扫描、使用合适的连接方式等方式来提高查询效率。 3. 使用子查询:子查询(Subquery)可以嵌套在主查询中,用于限制结果集或作为计算字段的来源。使用子查询可以简化复杂的查询逻辑,并提高可读性。 4. 使用临时表或表变量:当需要多次使用相同的结果集时,可以将查询结果存储在临时表或表变量中,避免重复查询和计算,提高性能。 5. 使用CTE(Common Table Expression):CTE是一种临时命名的查询结果集,可以在查询中多次引用,提高可读性和维护性。 6. 使用合适的连接方式:在进行表之间的关联查询时,选择合适的连接方式(如INNER JOIN、LEFT JOIN、RIGHT JOIN等)可以确保查询结果正确且高效。 7. 利用索引进行查询优化:合理创建和使用索引可以加快查询速度,尤其是在大型数据表中。根据查询的字段和条件,选择合适的索引策略,可以显著提高查询性能。 8. 使用视图(View):视图是一种虚拟的表,可以将复杂的查询逻辑封装为一个视图,使查询更简洁、可复用。 9. 使用合适的聚合函数:根据需要,选择合适的聚合函数(如SUM、AVG、COUNT、MAX、MIN等)进行数据统计和分析。 10. 使用合适的数据类型和字段命名:选择合适的数据类型可以节省存储空间和提高查询效率,良好的字段命名可以提高代码可读性和维护性。 这些只是一些常见的SQL查询技巧,实际应用中还会根据具体场景和需求进行调整和优化。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值