Присоединяйтесь к таблице в Snowflake, используя предложение between in where

У меня есть недельная таблица -

Week,   Friday_dates,   Start_date, End_date
1,      2021-07-16,     2021-07-12, 2021-07-18
2,      2021-07-23,     2021-07-19, 2021-07-25

и так далее..

У меня есть другая таблица со списком деталей по дате

Date,        To_do_list
20220-01-02, Text 
20220-01-03, Call
20220-01-03, Text
20220-01-04, Call
20220-01-05, Call

Я хочу подсчитать количество to_do_list, где написано Call, и хочу присоединиться к этой таблице с таблицей дат для определенных дат, подпадающих под start_date и end_date.

Кто-нибудь может мне помочь?

Пожалуйста, никогда размещать изображения кода, данных или сообщений об ошибках. Пожалуйста, отредактируйте свой вопрос и скопируйте/вставьте отформатированный текст в вопрос. Это сделано для того, чтобы мы могли попытаться воспроизвести проблему, не вводя все заново, и ваш вопрос мог быть правильно проиндексирован или прочитан программами чтения с экрана.
RiggsFolly 22.03.2022 18:09

Пожалуйста, не просите нас просто решить проблему или закодировать решение для вас. Мы приветствуем новичков, но мы ожидаем, что некоторые усилия с вашей стороны сам решит вашу проблему, прежде чем задавать вопрос. Так покажи нам свои лучшие усилия. SO не является бесплатной службой кодирования, хотя мы очень хотим помочь вам исправить проблемы с написанным вами кодом.

RiggsFolly 22.03.2022 18:11

Присоединяйтесь к столам, используя date BETWEEN start_date AND end_date в качестве условия присоединения. Используйте to_do_list = 'Call' в условии WHERE. И используйте COUNT(*), чтобы получить счет.

Barmar 22.03.2022 18:18

Это то, что я пытаюсь сделать, но застрял - выберите * из Weeks a левое соединение (выберите Date, count (*) из Activity, где To_do_list, например, группа «% Call% » по DATE) b on a.FRIDAY = где b .DATE между STARTDATE и ENDDATE Я застрял в предложении where

Sapna Gajjar 22.03.2022 18:24
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, учитывая ваши данные (я использую CTE, поэтому мне не нужно создавать таблицы)

WITH Weeks(Week, Friday_dates, Start_date, End_date) as (
    SELECT * FROM VALUES
    (1, '2021-07-16'::date, '2021-07-12'::date, '2021-07-18'::date),
    (2, '2021-07-23'::date, '2021-07-19'::date, '2021-07-25'::date)
), Activity(Date, To_do_list) as (
    SELECT * FROM VALUES
    ('20220-01-02'::date, 'Text'),
    ('20220-01-03'::date, 'Call'),
    ('20220-01-03'::date, 'Text'),
    ('20220-01-04'::date, 'Call'),
    ('20220-01-05'::date, 'Call')
)

Чтобы присоединить activity к weeks и ограничить подсчет только звонками, которые будут учитываться за неделю, вам нужно:

SELECT w.Friday_dates
    ,count(*) as call_count
FROM Activity AS a
JOIN Weeks AS w
    on a.DATE between w.Start_date and w.End_date
WHERE a.To_do_list = 'Call'
GROUP BY 1
ORDER BY 1;

что не дает никаких результатов, поскольку ни одна из ваших недель не перекрывает диапазоны времени активности.

Итак, если мы изменим данные, чтобы они перекрывались:

WITH Weeks(Week, Friday_dates, Start_date, End_date) as (
    SELECT * FROM VALUES
    (1, '2021-07-16'::date, '2021-07-12'::date, '2021-07-18'::date),
    (2, '2021-07-23'::date, '2021-07-19'::date, '2021-07-25'::date)
), Activity(Date, To_do_list) as (
    SELECT * FROM VALUES
    ('2021-07-18'::date, 'Text'),
    ('2021-07-18'::date, 'Call'),
    ('2021-07-18'::date, 'Text'),
    ('2021-07-19'::date, 'Call'),
    ('2021-07-20'::date, 'Call')
)

теперь мы получаем:

ПЯТНИЦА_DATESCALL_COUNT
2021-07-161
2021-07-232

Но если мы возьмем ваш SQL из комментария и сделаем его действительным:

select * from Weeks a 
left join (
    select Date, 
        count(*) from Activity 
    where To_do_list like '%Call%' 
    group by DATE
) b 
    on b.DATE between a.Start_date and a.End_date 
ORDER BY 1;

мы получили..

НЕДЕЛЮПЯТНИЦА_DATESДАТА НАЧАЛАДАТА ОКОНЧАНИЯДАТАСЧИТАТЬ(*)
12021-07-162021-07-122021-07-182021-07-181
22021-07-232021-07-192021-07-252021-07-191
22021-07-232021-07-192021-07-2520.07.20211

Другие вопросы по теме