У меня есть недельная таблица -
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.
Кто-нибудь может мне помочь?
Пожалуйста, не просите нас просто решить проблему или закодировать решение для вас. Мы приветствуем новичков, но мы ожидаем, что некоторые усилия с вашей стороны сам решит вашу проблему, прежде чем задавать вопрос. Так покажи нам свои лучшие усилия. SO не является бесплатной службой кодирования, хотя мы очень хотим помочь вам исправить проблемы с написанным вами кодом.
Присоединяйтесь к столам, используя date BETWEEN start_date AND end_date
в качестве условия присоединения. Используйте to_do_list = 'Call'
в условии WHERE
. И используйте COUNT(*)
, чтобы получить счет.
Это то, что я пытаюсь сделать, но застрял - выберите * из Weeks a левое соединение (выберите Date, count (*) из Activity, где To_do_list, например, группа «% Call% » по DATE) b on a.FRIDAY = где b .DATE между STARTDATE и ENDDATE Я застрял в предложении where
Итак, учитывая ваши данные (я использую 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')
)
теперь мы получаем:
ПЯТНИЦА_DATES | CALL_COUNT |
---|---|
2021-07-16 | 1 |
2021-07-23 | 2 |
Но если мы возьмем ваш 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 | ДАТА НАЧАЛА | ДАТА ОКОНЧАНИЯ | ДАТА | СЧИТАТЬ(*) |
---|---|---|---|---|---|
1 | 2021-07-16 | 2021-07-12 | 2021-07-18 | 2021-07-18 | 1 |
2 | 2021-07-23 | 2021-07-19 | 2021-07-25 | 2021-07-19 | 1 |
2 | 2021-07-23 | 2021-07-19 | 2021-07-25 | 20.07.2021 | 1 |