Удалить записи, основанные на другой записи макс таблицы - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть 2 таблицы: StoreProduct (с продуктами для продажи в каждом магазине) и Sales с продажами каждого продукта в магазине и за день.

 _________________        ____________________________________________
|   StoreProduct  |      |                      Sales                 |
-------------------      ----------------------------------------------
|StoreId|ProductId|      |StoreId|ProductId|     Date      | Quantity |
|1      | 1001    |      |1      | 1001    | '2019-04-15'  | 2        |
|1      | 1002    |      |1      | 1002    | '2019-04-15'  | 3        |
|2      | 1001    |      |2      | 1003    | '2019-04-15'  | 1        |
|2      | 1003    |      |1      | 1001    | '2020-04-25'  | 5        |
|2      | 1005    |      |1      | 1002    | '2020-04-25'  | 4        |
-------------------      |2      | 1005    | '2020-04-25'  | 2        |
                         ----------------------------------------------

И моя цель - удалить продукты из магазин, если они ничего не продавали в прошлом году.

В этом примере я удалил бы записи

StoreId ProductId
2       1001  (never sold)
2       1003  (only sold more than a year ago)

Легко найти те, которые никогда не продавались с осталось присоединиться. Но как мне проверить как тех, кто ничего не продал, так и тех, кто ничего не продал в прошлом году

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Вы можете использовать not exists:

select sp.*
from storeProduct sp
where not exists (
    select 1
    from sales s
    where 
        s.storeId = sp.storeId 
        and s.productId = sp.productId
        and s.date >= datefromparts(year(getdate()) - 1, 1, 1)
        and s.date <  datefromparts(year(getdate()), 1, 1)
)

Это дает вам строки из salesProduct, где в sales нет строк для тех же storeId и productId в последнем календарном году (на сегодняшний день это означает 2019 год).

2 голосов
/ 29 апреля 2020

Вы можете использовать not exists:

select sp.*
from storeproduct sp
where not exists (select 1
                  from sales s
                  where s.storeid = sp.storeid and s.productid = sp.productid and
                        s.date > dateadd(year, -1, getdate())
                 );

Если вы действительно хотите удалить строки:

delete sp from storeproduct sp
where not exists (select 1
                  from sales s
                  where s.storeid = sp.storeid and s.productid = sp.productid and
                        s.date > dateadd(year, -1, getdate())
                 );
...