查询以获取订单少于先前订单的客户列表
Query to get list of customers whose orders are less than the previous order
我正在尝试编写一个 sql 来获取总订购数量始终少于上一个订单的客户列表。由于第 n 次订单的总数量小于第 n-1 次订单的总数量,等等
SQL 创建和填充 table
create table orders (order_id int, customer_id varchar(5), order_date date, product_id varchar(5), quantity int);
Insert into orders values(01,'C1','2000-01-01','P1',10);
Insert into orders values(02,'C2','2002-01-01','P2',15);
Insert into orders values(03,'C3','2002-04-01','P3',17);
Insert into orders values(04,'C4','2003-04-01','P1',20);
Insert into orders values(05,'C4','2006-01-01','P2',1);
Insert into orders values(06,'C1','2006-05-01','P5',7);
我假设我需要编写一个基于 Order_id 序列号的过程和循环。进入循环后,我需要选择 product_id 和 order_id 对应的数量 Q。然后检查对于相同的 order_id 是否有任何其他数量 Q1 小于 Q。如果是,那么我打印 customer_id。
如果不是,则 order_id 移至下一个 order_id。
我不确定如何实施我检查数量列以检查是否有任何其他数量 Q1 < Q 的部分 order_id?
请说明
您应该根据 order_date 计算每个 customer_id 的 row_numbers。然后你必须将每个客户的第 n 行到第 n-1 行连接起来,并检查他们是否至少有一个订单数量少于前一个订单。
select t1.customer_id
from (select o.*,
@rn:=if(@previous=customer_id,@rn,0) + 1 as rownum,
@previous:=customer_id
from orders o, (select @rn:=0,@previous:=NULL) t
order by customer_id,order_date) t1
join (select o.*,
@rn:=if(@previous=customer_id,@rn,0) + 1 as rownum,
@previous:=customer_id
from orders o
order by customer_id,order_date) t2
on t1.customer_id=t2.customer_id and t1.rownum=t2.rownum-1
group by t1.customer_id
having count(case when t2.quantity < t1.quantity then 1 end) >= 1
一种方法使用相关子查询:
select o.*
from (select o.*,
(select o2.quantity
from orders o2
where o2.customer_id = o.customer_id and
o2.product_id = o.product_id and
o2.order_id < o.order_id
order by o2.order_id desc
limit 1
) prev_quantity
from orders o
) o
where o.prev_quantity > o.quantity;
我相信一个简单的连接本身就可以为您做到这一点,还有一个嵌入式查询可以根据日期识别要连接的正确行。
SELECT o1.customer_id, o2.order_date, o1.quantity - o2.quantity AS quantity_less
FROM orders o1
INNER JOIN orders o2 ON o2.customer_id = o1.customer_id AND
o2.order_date = (SELECT MIN(order_date) FROM orders
WHERE order_date > o1.order_date AND customer_id = o1.customer_id)
WHERE o2.quantity < o1.quantity
SELECT Customer_ID
FROM
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date
WHERE c.quantity< p.quantity AND c.order_date>p.order_date
)A
EXCEPT
SELECT Customer_ID
FROM
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date
WHERE c.quantity> p.quantity AND c.order_date>p.order_date
)B
我正在尝试编写一个 sql 来获取总订购数量始终少于上一个订单的客户列表。由于第 n 次订单的总数量小于第 n-1 次订单的总数量,等等
SQL 创建和填充 table
create table orders (order_id int, customer_id varchar(5), order_date date, product_id varchar(5), quantity int);
Insert into orders values(01,'C1','2000-01-01','P1',10);
Insert into orders values(02,'C2','2002-01-01','P2',15);
Insert into orders values(03,'C3','2002-04-01','P3',17);
Insert into orders values(04,'C4','2003-04-01','P1',20);
Insert into orders values(05,'C4','2006-01-01','P2',1);
Insert into orders values(06,'C1','2006-05-01','P5',7);
我假设我需要编写一个基于 Order_id 序列号的过程和循环。进入循环后,我需要选择 product_id 和 order_id 对应的数量 Q。然后检查对于相同的 order_id 是否有任何其他数量 Q1 小于 Q。如果是,那么我打印 customer_id。 如果不是,则 order_id 移至下一个 order_id。
我不确定如何实施我检查数量列以检查是否有任何其他数量 Q1 < Q 的部分 order_id?
请说明
您应该根据 order_date 计算每个 customer_id 的 row_numbers。然后你必须将每个客户的第 n 行到第 n-1 行连接起来,并检查他们是否至少有一个订单数量少于前一个订单。
select t1.customer_id
from (select o.*,
@rn:=if(@previous=customer_id,@rn,0) + 1 as rownum,
@previous:=customer_id
from orders o, (select @rn:=0,@previous:=NULL) t
order by customer_id,order_date) t1
join (select o.*,
@rn:=if(@previous=customer_id,@rn,0) + 1 as rownum,
@previous:=customer_id
from orders o
order by customer_id,order_date) t2
on t1.customer_id=t2.customer_id and t1.rownum=t2.rownum-1
group by t1.customer_id
having count(case when t2.quantity < t1.quantity then 1 end) >= 1
一种方法使用相关子查询:
select o.*
from (select o.*,
(select o2.quantity
from orders o2
where o2.customer_id = o.customer_id and
o2.product_id = o.product_id and
o2.order_id < o.order_id
order by o2.order_id desc
limit 1
) prev_quantity
from orders o
) o
where o.prev_quantity > o.quantity;
我相信一个简单的连接本身就可以为您做到这一点,还有一个嵌入式查询可以根据日期识别要连接的正确行。
SELECT o1.customer_id, o2.order_date, o1.quantity - o2.quantity AS quantity_less
FROM orders o1
INNER JOIN orders o2 ON o2.customer_id = o1.customer_id AND
o2.order_date = (SELECT MIN(order_date) FROM orders
WHERE order_date > o1.order_date AND customer_id = o1.customer_id)
WHERE o2.quantity < o1.quantity
SELECT Customer_ID
FROM
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date
WHERE c.quantity< p.quantity AND c.order_date>p.order_date
)A
EXCEPT
SELECT Customer_ID
FROM
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date
WHERE c.quantity> p.quantity AND c.order_date>p.order_date
)B