商城网站建设价格费用,廊坊网站建设推广,网站素材 下载,图片制作在线制作免费力扣题
1、题目地址
2084. 为订单类型为 0 的客户删除类型为 1 的订单
2、模拟表
活动表#xff1a;Orders
Column NameTypeorder_idintcustomer_idintorder_typeint
order_id是此表的主键列。此表的每一行都表示订单的ID、订购该订单的客户的ID以及订单类型。订单可以是…力扣题
1、题目地址
2084. 为订单类型为 0 的客户删除类型为 1 的订单
2、模拟表
活动表Orders
Column NameTypeorder_idintcustomer_idintorder_typeint
order_id是此表的主键列。此表的每一行都表示订单的ID、订购该订单的客户的ID以及订单类型。订单可以是类型0或类型1。
3、要求
编写SQL查询以根据以下条件报告所有订单
如果客户至少有一个类型为0的订单则不要报告该客户的任何类型为1的订单。 否则报告客户的所有订单。 按任意顺序返回结果表。
查询结果格式如下例所示。
示例 1
输入 Orders 表
order_idcustomer_idorder_type110210112012212131223031413241
输出
order_idcustomer_idorder_type3141324111021011202230
解释 客户1有两个类型为0的订单。我们两个都返回。 客户2的订单类型为0订单类型为1。我们只返回类型为0的订单。 客户3的订单类型为0订单类型为1。我们只返回类型为0的订单。 客户4有两个类型1的订单。我们两个都返回。
4、代码编写
代码思路
1、客户订单类型不存在为 0 则返回全部包括 0 和 1 2、客户订单类型存在为 0 返回 0
我的代码
SELECT *
FROM Orders a
WHERE NOT EXISTS(SELECT * FROM Orders WHERE customer_id a.customer_id AND order_type 0)
UNION ALL
SELECT *
FROM Orders a
WHERE EXISTS(SELECT * FROM Orders WHERE customer_id a.customer_id AND order_type 0)
AND order_type 0网友代码巧用 Dense_Rank 窗口函数
专用窗口函数rankdense_rankrow_number
Rank有相同名次名次按实际个数走会跳数字 Dense_rank: 有相同名次名次不跳数 Row_number相同分数按行数排序
分数RankDense_RankRow_number10011110011290323
SELECT order_id, customer_id, order_type
FROM (SELECT *,Dense_Rank() over (partition by customer_id order by order_type) rkFROM Orders
) AS a
WHERE rk 1逻辑对不同 customer_id 进行分组处理每个组里面根据 order_type 进行排序所以有 0 的话肯定是排在前面的使用的是 Dense_Rank 窗口函数这意味着如果 order_type 相同的话数字是不会增加的所以如果有 order_type 有存在等于 0 的话就返回对应 rk 1 返回 0就行如果 order_type 不存在等于 0 的话也就是返回全部 rk 1返回 1因为没有 0 的只能说用得很巧妙
Rank 窗口函数也是可以的
SELECT order_id, customer_id, order_type
FROM (SELECT *,Rank() over (partition by customer_id order by order_type) rkFROM Orders
) AS a
WHERE rk 1Dense_Rank 和 Rank 窗口函数可参考
MYSQL窗口函数Rows Range—— 滑动窗口函数用法