Снежинка слева Присоединиться с диапазоном дат - PullRequest
0 голосов
/ 30 сентября 2019

Я борюсь со снежинкой База данных LEFT JOIN запрос с диапазоном дат. Пожалуйста, найдите образец таблицы ниже

enter image description here

Мой SQL-запрос Snowflake: ВЫБРАТЬ O.ORDER_DATE, СЛУЧАЙ, КОГДА ORDER_DATEНЕДОСТУПНО ПОСЛЕ ТОГО, ЧТО «НЕТ», ДАЛЕЕ «ДА», КОНЕЦ, КАК ORDER_PLACED, C.CUSTOMER_ID, C.NAME ОТ ЗАКАЗЧИКА C ЛЕВЫМИ ЗАКАЗАМИ НА C.CUSTOMER_ID = O.CUSTOMER_ID И O.ORDER_DATE> = DATEADD (ДЕНЬ, -3, CURRENT_D)

Результат, который я ожидаю - Я хотел бы получить записи за последние 3 дня со всеми клиентами и независимо от того, сделали они заказ или нет, что-то вроде ниже

enter image description here

Текущий вывод данных, который я получаю с данным запросом снежинки:

enter image description here

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

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Должно ли это быть ORDER_DATE или CALENDAR_DATE, определяющее запрос? Если никто не заказывает в определенный день, все они должны иметь NO в столбце ORDER_PLACED?

Если это так, некоторые изменения в ответе от Гордон Линофф :

SELECT d.CAL_DATE, DECODE(COUNT(o.ORDER_ID), 0, 'NO', 'YES') ORD_PLCD, c.CUSTOMER_ID, c.NAME
FROM (
    SELECT DATEADD(DAYS, -SEQ1(), CURRENT_DATE) CAL_DATE
    FROM TABLE(GENERATOR(ROWCOUNT => 4))
) d
CROSS JOIN CUSTOMER c
LEFT OUTER JOIN ORDERS o ON o.ORDER_DATE = d.CAL_DATE AND o.CUSTOMER_ID = c.CUSTOMER_ID
GROUP BY d.CAL_DATE, c.CUSTOMER_ID, c.NAME
0 голосов
/ 30 сентября 2019

Используйте cross join для генерации строк и затем left join для получения результатов:

SELECT O.CTE, C.CUSTOMER_ID, C.NAME,
       MAX(CASE WHEN O.CUSTOMER_ID IS NULL THEN 'NO' ELSE 'YES' END) AS ORDER_PLACED, 
FROM CUSTOMER C CROSS JOIN
     (SELECT DISTINCT O.ORDER_DATE AS dte
      FROM ORDERS O
      WHERE O.ORDER_DATE >= DATEADD(DAY, -3, CURRENT_DATE)
     ) D LEFT JOIN
     ORDERS
     ON C.CUSTOMER_ID =  AND AND D.DTE = O.ORDER_DATE
GROUP BY O.CTE, C.CUSTOMER_ID, C.NAME;

Конечно, вы можете явно указать даты для производной таблицы d.

...