Как я могу получить последнюю дату, когда продукт был внесен в данные инвентаризации моего магазина?

#python #sql

#python #sql

Вопрос:

  --------- ------------- --------- 
| Product |    Date     | On Hand |
 --------- ------------- --------- 
| Item_1  | 11-Nov-2020 |       1 |
| Item_1  | 14-Nov-2020 |       0 |
| Item_1  | 18-Nov-2020 |       0 |
| Item_1  | 25-Nov-2020 |       1 | <--- for Item_1
| Item_1  | 28-Nov-2020 |       1 |
| item_2  | 11-Nov-2020 |       1 | <--- for Item_2
| item_2  | 14-Nov-2020 |       1 |
| item_2  | 18-Nov-2020 |       1 |
| item_2  | 25-Nov-2020 |       1 |
| item_2  | 28-Nov-2020 |       1 |
| item_3  | 11-Nov-2020 |       1 |
| item_3  | 14-Nov-2020 |       0 |
| item_3  | 18-Nov-2020 |       1 |
| item_3  | 25-Nov-2020 |       0 |
| item_3  | 28-Nov-2020 |       0 | <-- Out of stock
 --------- ------------- --------- 
  

У меня есть фрейм данных, подобный приведенному выше, и я хотел бы получить новый фрейм данных с последней датой, когда продукт был представлен в магазине. Что-то вроде этого:

  --------- -------------- 
| Product |  Last Entry  |
 --------- -------------- 
| Item_1  | 25-Nov-2020  |
| Item_2  | 11-Nov-2020  |
| Item_3  | Out of stock |
 --------- -------------- 
  

Я хотел бы получить решение либо для Python, либо для SQL.

Комментарии:

1. Пометьте свой движок SQL.

Ответ №1:

Хммм … Один из методов заключается в использовании обратной суммы дней, когда . onhand = 0 Это 0 для последней группы. Затем вам нужна самая ранняя дата для каждого товара:

 select item, min(date)
from (select t.*,
             sum(1 - onhand) over (partition by product order by date desc) as grp
      from t
     ) t
where grp = 0 and onhand = 1
group by item;
  

Ответ №2:

Даже если вы можете делать такие вещи, как сказал @gordonlinoff, или что-то вроде этого

 with helper as 
   (select t.product, max(t.date) date from test t group by t.product) 
   select 
      h.product, 
      case when t.on_hand = 0 then 'out of date' else h.date::text end 
      from helper h
      join test t using(date, product);
  

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

 with helper as 
  (select t.product, max(t.date) date from test t group by t.product) 
   select 
      h.*, t.on_hand  
      from helper h
      join test t using(date, product);
  

Что дает вам такой результат

 product  |    date    | on_hand 
--------- ------------ ---------
 item_1  | 2020-10-03 |       1
 item_2  | 2020-10-03 |       0
  

Таким образом, вы можете работать с этими данными более подходящим способом.