使用 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