簡體   English   中英

查詢以獲取其訂單少於先前訂單的客戶列表

[英]Query to get list of customers whose orders are less than the previous order

我正在嘗試編寫一個sql,以獲取總訂購單位始終小於前一訂單的客戶列表。 如第n階的總數量小於第n-1階的總數量,依此類推

SQL創建和填充表

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序列號編寫一個過程和LOOP。 循環后,我需要選擇與order_id相對應的product_id和數量Q。 然后檢查相同的order_id是否存在小於Q的其他數量Q1。如果是,則打印customer_id。 如果不是,則order_id移至下一個order_id。

我不確定如何實現檢查數量列的部分,以檢查是否有其他數量Q1 <Q for order_id?

請澄清

您應該基於order_date計算每個customer_id的row_numbers。 然后,您必須將每個客戶的第n行添加到第n-1行,並檢查他們是否有至少一個訂單(數量少於前一個訂單)。

SQL Fiddle

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM