背景

有一张表:

date store_id sku sales
2023-01-01 CK005 03045 50

date 代表交易日期,store_id代表门店编号,sku代表商品,sales代表销量。

问题

求出2022年每家店销量前3的sku。

生成的表为4列,第一列为store_id,第二至第四列依次为销量排名前三的sku,如果某家门店只卖两个sku,即没有销量排名第三的sku,那么那个单元格用null值代替

sql解法

select `store_id`,
max(`SKU_1`) as `TOP_SKU_1`,
max(`SKU_2`) AS `TOP_SKU_2`,
max(`SKU_3`) AS `TOP_SKU_3` from (
select `store_id`,
IF(`rank_num` = 1, `sku`, NULL) AS `SKU_1`,
IF(`rank_num` = 2, `sku`, NULL) AS `SKU_2`,
IF(`rank_num` = 3, `sku`, NULL) AS `SKU_3`
from
(select *, row_number() over (partition by `store_id` order by `sales` desc) as `rank_num`
from (
SELECT `store_id`, `sku`, sum(`qty`) as `sales` FROM input
where year(`date`) = 2022
group by `store_id`, `sku`))
where `rank_num` <= 3 )
group by `store_id`

结果校验:

其中:

排序然后case或者if之后是这样的:

select *
from
(select *, row_number() over (partition by `store_id` order by `sales` desc) as `rank_num`
from (
SELECT `store_id`, `sku`, sum(`qty`) as `sales` FROM input
where year(`date`) = 2022
group by `store_id`, `sku`))
where `rank_num` <= 3



然后再加一个group by的操作,用聚合函数max取出每一组的值。

Python解法

  1. 求出销量前三的sku
df = hist_month.query('year == 2022').groupby(['year','stock_id','sku'],as_index = False).agg({'y':sum})
df['y_rank'] = df.groupby("stock_id")["y"].rank( ascending=False) top3_df = df.query('y_rank <= 3')
top3_df

temp = top3_df.set_index(['year','stock_id','y_rank'])['sku'].unstack()
temp = temp.rename_axis(columns=None).reset_index()

sql求每家店铺销量前三的sku, 附python解法的更多相关文章

  1. E - Leading and Trailing 求n^k得前三位数字以及后三位数字,保证一定至少存在六位。

    /** 题目:E - Leading and Trailing 链接:https://vjudge.net/contest/154246#problem/E 题意:求n^k得前三位数字以及后三位数字, ...

  2. 1282 - Leading and Trailing 求n^k的前三位和后三位。

    1282 - Leading and Trailing You are given two integers: n and k, your task is to find the most signi ...

  3. oracle(sql)基础篇系列(三)——数据维护语句、数据定义语句、伪列

      DML语句 insert 向表中插入新的记录   --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 insert into dept2 values(50,'DANAM ...

  4. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  5. SQL实现分组查询取前几条记录

    我要实现的功能是统计订单日志表中每一个订单的前三条日志记录,表结构如下: 一个订单在定点杆日志表中有多条记录,要根据时间查询出每一个订单的前三条日志记录,sql如下: select b.OrderNu ...

  6. Leading and Trailing LightOJ - 1282 (取数的前三位和后三位)

    题意: 求n的k次方的前三位 和 后三位 ...刚开始用 Java的大数写的...果然超时... 好吧  这题用快速幂取模求后三位  然后用一个技巧求前三位 ...orz... 任何一个数n均可以表示 ...

  7. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  8. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  9. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  10. Blog总结(前三次作业总结)

    前三次作业总结 1.前言 (1)第一次题目集共有8道题目,难度较为简单,知识点为JAVA的一些编程基础知识点,如输入输出,选择,循环,一维数组等. (2)第二次题目集共有5道题目,难度较第一次题目集有 ...

随机推荐

  1. 【项目记录】3:pyinstaller打包之后tkcalendar无法使用的解决办法

    PyInstaller 没有检测到二级导入这一事实.tkcalendar 的HowTos文档中解释了解决此问题的方法: 使用 PyInstaller 捆绑应用程序时, 检测 tkcalendar 的 ...

  2. js 获取鼠标位置的两种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Python爬虫之Scrapy制作爬虫

    前几天我有用过Scrapy架构编写了一篇爬虫的代码案例深受各位朋友们喜欢,今天趁着热乎在上一篇有关Scrapy制作的爬虫代码,相信有些基础的程序员应该能看的懂,很简单,废话不多说一起来看看. 前期准备 ...

  4. api接口基础Day2

    精华笔记: 正则表达式: 用于描述字符串的内容格式,使用它通常用于匹配一个字符串是否符合格式要求 正则表达式的语法:-------------了解.不用纠结.不用深入研究 1.[]:表示一个字符,该字 ...

  5. Python笔记(5)——if 语句一:条件测试(Python编程:从入门到实践)

    每条if语句的核心都是一个值为True或False的表达式.Python根据条件测试的值为True还是False来决定是否执行if语句中的代码.如果条件测试的值为True,Python就执行紧跟在if ...

  6. html:表格

    HTML:表格1.表格三标签:(1)<table> 表格(2)<tr>  行(3)<td>  单元格 2.表格的基本语法和结构<table> <t ...

  7. Ansys经验之:杨氏模量的本质概念理解——仿真在线工作记录

    Ansys经验之:什么是杨氏模量? 这是我见到的很多来培训的结构力学仿真人员的困惑,始终不能只管理解,但又是一个入门的重要概念. 本质:杨氏模量=应力/应变,即单位应变的应力.那什么叫单位应变呢,也很 ...

  8. git—分支设置

    什么是分支? 项目以上线,但需要开发新的功能.不能直接在项目上进行开发的,这时候就需要创建一个分支,去完成新功能的开发.测试等.完成之后合并到主分支上面.如果新功能的开发不用分支,导致的问题就会有很多 ...

  9. C++ STL的简单应用(vector容器专题)

    #include <iostream> #include <string> #include <stdlib.h> #include <vector> ...

  10. 7. 基础增删改 - 使用Portal Webapi进行会员信息的增删改

    我们可以通过使用Portal Web API在Portal页面中跨所有Microsoft Dataverse表执行创建.更新和删除操作,下面我们就一起来看一下如何通过使用AJAX函数来进行操作. AJ ...