2017-02-21 30 views
-1

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

Мне нужна помощь, чтобы написать запрос sql, чтобы получить заказы, которые потребовались за один или несколько дней (на основе rquirement), чтобы выгрузить из местоположения.

Тип столбца активности представляет 1,2,3,4

1-Order placed 
2-Order discharged 

Дата записывается в дату столбца в соответствующей строке

Теперь я хотел бы призвать всех заказов, в заняло более определенного количества дней «n»

Это пример таблицы, как выглядит мой стол.

Деятельность Таблица

|Order Nr| activity|date| 
|  1 |  1 | date1| order placed 
|  1 |  3 | date2| order approved 
|  1 |  4 | date3| order packed 
|  1 |  2 | date4| order discharged 
+0

Благодаря Siyual для форматирования мои вопросы! Привет, Sai – Sai

ответ

0

Вы размещения заказа с

select * from activities where activity = 1 

и вы, вероятно, можете догадаться, как получить разряды порядка :-)

Так объединить два и держать только те строки, слишком высокая разница:

select p.order_nr, p.date as placed, d.date as discharged 
from (select * from activities where activity = 1) p 
join (select * from activities where activity = 2) d 
    on d.order_nr = p.order_nr and datediff(d.date, p.date) > 1; 

Вы можете получить то же самое с агрегацией в порядке:

select 
    order_nr, 
    any_value(case when activity = 2 then date end) as placed, 
    any_value(case when activity = 1 then date end) as discharged 
from activities 
group by order_nr 
having datediff(any_value(case when activity = 2 then date end), 
       any_value(case when activity = 1 then date end)) > 1; 

В случае, если вы хотите включить открытые заказы, вы бы сделали почти то же самое. Для заказов без разряженной записи возможно, что это будет введено сегодня, поэтому заказы, размещенные вчера, могут все еще быть в порядке, тогда как заказы, размещенные ранее, слишком долго открыты. Поэтому, если нет записи с дихотомированием, мы хотим притвориться, что есть дата с датой = сегодня.

Запрос # 1:

select p.order_nr, p.date as placed, d.date as discharged 
from (select * from activities where activity = 1) p 
left join (select * from activities where activity = 2) d 
    on d.order_nr = p.order_nr and datediff(coalesce(d.date, curdate()), p.date) > 1; 

Запрос # 2:

select 
    order_nr, 
    any_value(case when activity = 2 then date end) as placed, 
    any_value(case when activity = 1 then date end) as discharged 
from activities 
group by order_nr 
having datediff(any_value(case when activity = 2 then date end), 
       coalesce(any_value(case when activity = 1 then date end), curdate())) > 1; 
+0

Привет, Торстен, спасибо! Я дам вам знать сразу после проверки моих результатов. Приветствую вас, Sai – Sai

+0

Добро пожаловать. Я только что заметил, я путал значения активности. Я исправил их сейчас (активность 2 вместо 4 для разрядов). Мои запросы не находят заказов, которые были написаны до вчерашнего дня, и, кстати, не имеют записи о разрядке. Если вы хотите включить их, вам понадобится внешнее объединение и объединение в первом запросе и коалесценция во втором. Скажите, если я включу их в свой ответ. –

+0

Я заметил номер заказа, его не проблема abig. Было бы неплохо, если бы вы могли добавить Outer Join. Я очень ценю :) – Sai

1

Not exists является одним из способов:

select a.* 
from activities a 
where a.activity = 'placed' and 
     not exists (select 1 
        from activities a2 
        where a2.activity = 'discharged' and 
         a2.ordernum = a.ordernum and 
         a2.date >= a.date and 
         a2.date <= a.date + interval 1 day 
       ); 
+0

Привет, Гордон! Я очень ценю ваш быстрый ответ. Я сожалею, что не понял запрос select после НЕ СУЩЕСТВУЕТ! Большое спасибо! Приветствия, Sai – Sai

+0

@Sai: Это означает: если не существует разряженной записи для того же ordernum с датой позже, чем через один день после даты размещения. –

+0

@ThorstenKettner Что делает 'select 1'? – Sai