根据日期计算不同的 ID

Counting distinct ID based on date

所以我有一个table如下:

ID   create_date
001   01/01/2021
002   02/04/2021
003   07/22/2021
004   01/29/2021
005   03/01/2021

ID 对于 table 是唯一的。

我有另一个 table(下图),其中这些 ID 与另一个变量一起多次出现,标题为 code_id

ID  code_id  date        data
001       A  01/01/2021  xxx
002       W  02/08/2021  xxx
002       B  03/06/2021  xxx
001       A  01/19/2021  xxx
002       C  05/01/2021  xxx
004       D  12/01/2021  xxx
001       K  01/02/2021  xxx
001       J  01/15/2021  xxx
005       A  03/01/2021  xxx
005       A  03/01/2021  xxx
005       B  03/05/2021  xxx
005       B  03/30/2021  xxx
005       C  03/30/2021  xxx
005       D  04/01/2021  xxx

我想做的是创建一个新的 table(最好通过 CTE,但可以加入选项),它显示 code_id 在 5 和从 table1.create_date.

起 30 天

换句话说,从 create_date 开始的 x 天后,每个 ID 出现了多少个不同的 code_id,其中 x 分别等于 5 和 30。

这是结果 table 我寻求:

ID   distinct_code_id_5_day   distinct_code_id_30_day   distinct_code_id_total
001                       2                         3                        3
002                       1                         2                        3 
003                       0                         0                        0 
004                       0                         0                        1
005                       2                         3                        4

ID = 001 的情况下,我们显示从 01/01/2021 - 01/05/2021 出现的所有 code_id,包括 distinct_code_id_5_day 和 01/ 01/2021 - 01/30/2021,包括 distinct_code_id_30_day.

你应该能够用 join 和几个 iff() 与日期数学来解决这个问题:

with ids as (
select split(value, '   ') x, x[0] id, x[1]::date create_date
from table(split_to_table('001   01/01/2021
002   02/04/2021
003   07/22/2021
004   01/29/2021
005   03/01/2021', '\n'))
), data as(
select split(value, ' ') x, x[0] id, x[7] code_id, x[9]::date date, x[11] data
from table(split_to_table('001       A  01/01/2021  xxx
002       W  02/08/2021  xxx
002       B  03/06/2021  xxx
001       A  01/19/2021  xxx
002       C  05/01/2021  xxx
004       D  12/01/2021  xxx
001       K  01/02/2021  xxx
001       J  01/15/2021  xxx
005       A  03/01/2021  xxx
005       A  03/01/2021  xxx
005       B  03/05/2021  xxx
005       B  03/30/2021  xxx
005       C  03/30/2021  xxx
005       D  04/01/2021  xxx', '\n')))

select id, count(distinct code5), count(distinct code30), count(distinct code_id)
from (
    select a.id, iff(a.create_date + 5 >= b.date, b.code_id, null) code5
        , iff(a.create_date + 30 >= b.date, b.code_id, null) code30
        , b.code_id
    from ids a
    left outer join data b
    where a.id=b.id
)
group by 1