Leetcode题解之database(十三)1777. Product‘s Price for Each Store

从今天开始继续解锁 力扣《数据库》题目,不过这次是VIP题目,还是按照由易到难来题解。
今天要看的就是第 1777题👉Product’s Price for Each Store(每家商店的产品价格)

此题主要考察知识点: 三个字👉 行转列! 具体到方法就是 CASE WHEN / IF 和 聚合函数(SUM、MAX等)的使用。

解题思路👇:
在这里插入图片描述
在这里插入图片描述
由上图题目的示例Products 表和Result 表可很明显的看出来,Products表的store 列值变到了 Result表的不同行,这就是很典型的 行转列 问题!

针对 行转列问题,常见的做法就是 利用CASE WHEN /IF 和聚合函数来进行筛选。(如果还有朋友不清楚❓为何CASE WHEN /IF 后还要搭配 聚合函数,请查看上一篇👉Leetcode题解之database(七)1179. Reformat Department Table, 讲的很详细了,谢谢)

下面给出参考解法👇:

  • 解法一:CASE WHEN函数和聚合函数(SUM)
SELECT product_id, 
SUM(CASE WHEN `store` = 'store1' THEN price ELSE null END) store1,
SUM(CASE WHEN `store` = 'store2' THEN price ELSE null END) store2,
SUM(CASE WHEN `store` = 'store3' THEN price ELSE null END) store3
FROM Products GROUP BY product_id;

在这里插入图片描述

  • 解法二:IF函数和聚合函数(SUM)
SELECT product_id, 
SUM(IF(`store` = 'store1', price, null)) store1,
SUM(IF(`store` = 'store2', price, null)) store2,
SUM(IF(`store` = 'store3', price, null)) store3
FROM Products GROUP BY product_id;

在这里插入图片描述
比解法一快了不少。

主要就是上面两个(当然还有其他解法,但是不算简便,这里就不提了),不过掌柜在看题解区的优质解法的时候看到这么一个写法:
在这里插入图片描述
这位朋友把 GROUP BY product_id 改成了 GROUP BY 1 。这个操作不得不说有点意思,那么为何写成group by 1 同样也可以分组去重呢???

好奇的掌柜随手一查StackOverflow就找到了答案👇:
在这里插入图片描述
在这里插入图片描述

原来写上 GROUP BY 1 就表示 选取查询的第一列, 但不用管第一列叫什么。同样的操作也可以用到 ORDER BY 语法里。 但是要注意的是:起始数字是 1 ,而不是0!!!

掌柜也提交了这个解法后发现比第一个解法快一些,但是没有第二个快!
在这里插入图片描述

这么看来以后如果想少写几个字母,就可以采用这个方法😂。

-----------------------------------------我是拓展分割线----------------------------------------------------------
此题的题解到这里就基本结束了,下面掌柜进行两个小小的拓展:
(一)列转行
既然上面考到了行转列,那么下次极有可能会遇到 列转行的情况,所以 列转行又该如何解决呢?
还是用上面的数据,不过此时原始表是 Result表:
在这里插入图片描述
下面我们要转换得到👉Product表,只需要一个 UNION语法即可解决!!! 如下:
在这里插入图片描述
PS: select还原的 第二个位置,比如这里有三个值(store1、store2、store3)就直接用字符串格式(即单双引号加上对应字符串)作为第二列的值;如果是四个值,那就还要再UNION + SELECT 一行。
要还原的第三个price列,直接写上store1,不需要加单/双引号!!! 因为这里取的store1下面的对应值!切记注意这里!!!

(二)Pandas的行转列 与 列转行
还是上面的示例数据,首先看pandas是如何行转列的:
在这里插入图片描述
在这里插入图片描述
其实还是很简单,用一个pivot函数即可不过生成的新数据集重置索引才能得到想要的Result表形式。

同理pandas的列转行也是一个 melt函数即可解决
在这里插入图片描述
简单解释一下,这里的id_vars参数就是作为标识变量的列,即不需要取消透视的列;而value_vars参数就是要取消透视的列。如果未指定,则使用未设置为id_vars的所有列。最后用value_name参数定义对应值的列名。

好了,一道简单的力扣题已经延伸了很多了,希望对大家有帮助!😁

参考资料:
mysql 行转列 列转行
pandas官方文档pivot函数
pandas官方文档melt函数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值