SQL题目记录

1.商品推荐题目

1.思路:

  • 通过取差集 得出要推荐的商品
  • 差集的选取:except直接取差集 或者a left join b on where b = null

2.知识点

1.except
sql 复制代码
select
  friendship_info.user1_id as user_id,
  sku_id
from
  friendship_info
  join favor_info on friendship_info.user2_id = favor_info.user_id
except
select
  user_id,
  sku_id
from
  favor_info
2.交并差

2.连续日期

1. 思路:

1.通过lag(向上) lead(向下)求出2天,三天比较
2.通过rk和日期进行相减
  • 其实就是连续的日期进行分组,将连续的放入一组,不连续的放入另一组
  • 第一步, 使用开窗 构造rk
  • 计算日期和rk的差值,算出差值日期,这个差值日期就保证同一个分组,
  • 使用开窗count 算出每个分组是否有 符合要求的 >=2
sql 复制代码
  with
  s1 as (
    select
      user_id,
      date (login_ts) start_date,
      row_number() OVER (
        PARTITION by
          user_id
        order by
          date (login_ts)
      ) rk
    from
      user_login_detail
    GROUP by
      user_id,
      date (login_ts)
  ),
  s11 as (
    select
      user_id,
      start_date,
      date_sub (start_date, rk) head_date
    from
      s1
  )
select
  user_id,
  min(start_date) `start_date`,
  max(start_date) `end_date`
from  s11 
GROUP by user_id,
  head_date
HAVING datediff(max(start_date) ,min(start_date))>=1

3. 截止到某天统计最近几天的总和和平均值

1.思路

其实想法都是一样的,要求截止到当天,最近3天的数据,就要把前两天的数据拿过来,

方法有两个,一个是自连接join 一个是直接开窗

1. join

join需要考虑空值,分母就少了,所以需要一个if判断

2.开窗函数

开窗直接sum avg 但是首先注意,这里时间是String类型,无法进行between and

需要转化成日期类型或者时间戳(秒 毫秒 都是int类型)

注意range的用法,range 的between and 是根据 前面的值进行减法 加法

比如 order by timestamp_day RANGE BETWEEN 172800 PRECEDING and current row 就是 范围是 当前行的timestamp_day -172800 到当前行 如果后面用following就是加

sql 复制代码
with
  s1 as (
    select
      create_date,
      sum(total_amount) total_Day,
      unix_timestamp(date(create_date)) timestamp_day
    from
      order_info
    GROUP by
      create_date
  )
select
	create_date,

    cast(sum(total_Day) over(order by timestamp_day RANGE BETWEEN  172800 PRECEDING and current row ) as decimal(16,2)) total_3d,
    cast(avg(total_Day) over(order by timestamp_day RANGE BETWEEN  172800 PRECEDING and current row ) as DECIMAl(16,2) )avg_3d
from s1
相关推荐
Azoner14 分钟前
postgresql安装部署(linux)
数据库·postgresql
PyAIGCMaster39 分钟前
文本模式下成功。ubuntu P104成功。
服务器·数据库·ubuntu
drebander1 小时前
MySQL 查询优化案例分享
数据库·mysql
初晴~1 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581361 小时前
InnoDB 的页分裂和页合并
数据库·后端
YashanDB3 小时前
【YashanDB知识库】XMLAGG方法的兼容
数据库·yashandb·崖山数据库
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
数据库·安全·web安全·漏洞挖掘·sql注入·hw·xml注入
风间琉璃""4 小时前
bugkctf 渗透测试1超详细版
数据库·web安全·网络安全·渗透测试·内网·安全工具
drebander4 小时前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql
IvorySQL4 小时前
IvorySQL 4.0 发布:全面支持 PostgreSQL 17
数据库·postgresql·开源数据库·国产数据库·ivorysql