Снежинка Left Join с диапазоном дат

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

введите здесь описание изображения

Мой SQL-запрос Snowflake: ВЫБЕРИТЕ O.ORDER_DATE, СЛУЧАЙ, КОГДА ORDER_DATE ЕСТЬ NULL ТОГДА "NO" ELSE "YES" END AS ORDER_PLACED, C.CUSTOMER_ID, C.NAME FROM CUSTOMER C LEFT JOIN ORDERS ON C.CUSTOMER_ID = O.CUSTOMER_ID И O.ORDER_DATE> = DATEADD (DAY, -3, CURRENT_DATE)

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

введите здесь описание изображения

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

введите здесь описание изображения

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

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


person user957183    schedule 30.09.2019    source источник
comment
Не размещайте изображения, пожалуйста!   -  person Antonio Veneroso Contreras    schedule 30.09.2019
comment
Просто отсканируйте это, но пробовали ли вы удалить LEFT и использовать внутреннее соединение?   -  person Steve Midgley    schedule 30.09.2019
comment
Последние 3 дня заказов для каждого клиента или заказы в течение последних 3 дней?   -  person Ross Bush    schedule 30.09.2019
comment
Похоже, вам нужны все записи из таблицы клиентов с указанием заказа, размещенного в течение последних трех дней. Если это так, то ЛЕВОЕ СОЕДИНЕНИЕ верно, однако вы удаляете клиентов, которые разместили заказ более 3 дней назад.   -  person Ross Bush    schedule 30.09.2019
comment
Пожалуйста, используйте текст, а не изображения / ссылки для текста, включая таблицы и ERD. Перефразируйте или цитируйте другой текст. . Дайте только то, что вам нужно, и соотнесите это со своей проблемой. Используйте изображения только для того, что не может быть выражено в виде текста или для дополнения текста. Изображения нельзя искать, вырезать и вставлять. Включите легенду / ключ и объяснение с изображением. Пожалуйста, перед публикацией посмотрите отформатированную версию вашего сообщения под полем редактирования. Прочтите справку по редактированию, чтобы узнать о встроенных и блочных форматах кода и цитат.   -  person philipxy    schedule 01.10.2019
comment
В вопросах кода дайте минимальный воспроизводимый пример - вырезать и вставить & запускаемый код; пример ввода (как код инициализации) с желаемым и фактическим выводом (включая дословные сообщения об ошибках); теги и версии; четкая спецификация и объяснение. Это включает в себя наименьшее количество кода, который вы можете указать, то есть код, который вы показываете "ОК", расширенный кодом, который вы показываете "Не ОК". (Основы отладки.) Для SQL, который включает СУБД / продукт и DDL, который включает ограничения, индексы и инициализацию базовой таблицы в табличном формате.   -  person philipxy    schedule 01.10.2019
comment
извиняюсь за размещение изображений, угадайте, что это причина недоголосования :(   -  person user957183    schedule 02.10.2019


Ответы (2)


Используйте 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 производной таблицы.

person Gordon Linoff    schedule 30.09.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
person Hans Henrik Eriksen    schedule 04.10.2019