#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
Таким образом, вы можете работать с этими данными более подходящим способом.