Создать список дат, если значения существуют до и после определенного периода времени - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующая таблица, которую вы также можете найти в SQL Fiddle здесь :

CREATE TABLE Orders (
    Customer TEXT,
    Order_Date DATE
);

INSERT INTO Orders
(Customer, Order_Date)
VALUES 
("Customer A", "2017-05-23"),
("Customer A", "2019-01-03"),
("Customer A", "2019-02-15"),
("Customer A", "2019-02-16"),

("Customer B", "2018-09-10"),
("Customer B", "2019-01-09"),

("Customer C", "2016-09-04"),
("Customer C", "2019-02-12"),
("Customer C", "2019-02-20"),

("Customer D", "2017-03-15"),
("Customer D", "2019-02-17"),
("Customer D", "2019-02-19"),
("Customer D", "2019-02-20"),

("Customer E", "2019-02-03"),
("Customer E", "2015-10-12");

Как видно из таблицы, отображаются даты заказа от разных клиентов.
Я использую приведенный ниже SQL, чтобы получить unique count of orders для клиентов, которые:

a) placed an order in February 2019 and
b) did not place an order in the 12 month before and
c) placed an order before this 12 months period

Ссылаясь на ответ здесь .

SELECT o.Customer,
       MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) as num_feb_orders
FROM ORDERS o
GROUP BY o.Customer
HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
       SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
       SUM( o.Order_Date < '2018-02-01' ) > 0 ;

Все этодо сих пор работает нормально.


Однако теперь вместо GROUP BY на основе клиента я хочу сделать GROUP BY на основе Order_Date, поэтому все latest order_dates in February относятся к клиентамчто заполнить вышеуказанные критерии должны быть перечислены.Результат должен выглядеть следующим образом.

Order_Date      UniqueOrders
2019-02-03            1       --> Customer E
2019-02-20            2       --> Customer C and Customer D

Что мне нужно изменить в своем коде, чтобы эта работа работала?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

SELECT last_feb_order_date, COUNT(*) as num_customers
FROM (SELECT o.Customer,
             MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) as num_feb_orders,
             MAX(CASE WHEN o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' THEN o.Order_Date END) as last_feb_order_date
      FROM ORDERS o
      GROUP BY o.Customer
      HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
             SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
             SUM( o.Order_Date < '2018-02-01' ) > 0
     ) oc
GROUP BY last_feb_order_date
ORDER BY last_feb_order_date;
0 голосов
/ 26 февраля 2019

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

SELECT OrderDate, 
    (COUNT(*) 
     FROM (
         SELECT o.Customer, MAX(o.Order_Date) AS OrderDate,
             MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) AS UniqueOrders
         FROM ORDERS AS o
         GROUP BY o.Customer
        HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
           SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
           SUM( o.Order_Date < '2018-02-01' ) > 0)a
GROUP BY OrderDate ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...