2016-10-12 6 views
0

Я пытаюсь написать sql, чтобы получить список клиентов, чьи полные упорядоченные единицы последовательно меньше предыдущего. Как и в Total Кол-во го порядка меньше, чем Шт в п-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); 

Я предполагаю, что мне нужно написать процедуру и LOOP на основе серийного номера Order_id. Однажды в цикле мне нужно выбрать product_id и количество Q, соответствующее order_id. Затем проверьте, есть ли для того же order_id какая-либо другая Q1, которая меньше Q. Если это так, я печатаю customer_id. Если нет, то order_id переходит к следующему order_id.

Я не уверен, как реализовать часть, где я проверяю колонку количества, чтобы проверить, есть ли какая-либо другая величина Q1 < Q для order_id?

Просьба уточнить

+0

как должен выглядеть выход? –

+0

OUTPUT будет списком клиентов. C1 C4 Поскольку у обоих этих клиентов заказы, где заказ меньше предыдущего (7 <10) для C1 – user1940212

+0

Вы хотите посмотреть последний и последний заказ последнего клиента? Или вы обычно ищете клиентов, у которых был заказ в какой-то момент, который был меньшим, чем какой-то предыдущий заказ? (Последнее может быть достигнуто с помощью простого предложения 'EXISTS'.) –

ответ

1

Вы должны рассчитать row_numbers за каждый Customer_ID на основе order_date. Затем вам нужно присоединиться к 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 
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; 
+0

Не работает. Я попытался обновить clientid как customer_id и другие обновления, чтобы проверить, предоставлены ли какие-либо записи, но все равно не удается – user1940212

+0

@ user1940212. , , Как это «не работает»? Это очень расплывчато. –

0

Я считаю, что простое соединение на себя может сделать это для вас, наряду со встроенным запросом, чтобы определить правильную строку присоединяйтесь к дате.

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 
-1
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 
Смежные вопросы