使用 between in where 子句在 Snowflake 中加入 table
Join table in Snowflake using between in where clause
我有周table -
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
等等..
我还有另一个 table,其中包含按日期列出的详细信息列表
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 and want join this table with date table for specific dates falling under start_date and end_date.
有人能帮帮我吗?
鉴于您的数据(我使用的是 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;
没有结果,因为您的 none 周与 activity 时间范围重叠。
因此,如果我们将数据更改为重叠:
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')
)
我们现在得到:
FRIDAY_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;
我们得到..
WEEK
FRIDAY_DATES
START_DATE
END_DATE
DATE
COUNT(*)
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
2021-07-20
1
我有周table -
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
等等..
我还有另一个 table,其中包含按日期列出的详细信息列表
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 and want join this table with date table for specific dates falling under start_date and end_date.
有人能帮帮我吗?
鉴于您的数据(我使用的是 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;
没有结果,因为您的 none 周与 activity 时间范围重叠。
因此,如果我们将数据更改为重叠:
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')
)
我们现在得到:
FRIDAY_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;
我们得到..
WEEK | FRIDAY_DATES | START_DATE | END_DATE | DATE | COUNT(*) |
---|---|---|---|---|---|
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 | 2021-07-20 | 1 |