这个表非常简单,只有两列-user_id和date。我想做的是选择2020年、2019年和2018年交易的所有user_id。
我不知道如何做到这一点,我试图用2020年交易的user_ids制作一张表,并与2019年交易的人一起加入,然后与2018年交易的人们一起加入。
这是代码:
select DISTINCT(user_id)
from (
(
( SELECT t1.user_id
FROM table as t1
WHERE EXTRACT( YEAR FROM date) = 2020
) as flag_2020
JOIN
(
SELECT t2.user_id
FROM table as t2
WHERE EXTRACT( YEAR FROM date) = 2019
) as flag_2019
ON flag_2019.user_id = flag_2020.user_id
) as tab2
JOIN
( SELECT t3.user_id
FROM table as t3
WHERE EXTRACT( YEAR FROM date) = 2018
) as flag_2018
ON tab2.user_id= flag_2018.user_id
)
这不起作用,并且在"tab2 JOIN"行附近出现检查语法错误。我不知道该怎么做。
我想做的是选择在2020年、2019年和2018年交易的所有user_id。
一个简单的方法使用聚合:
select user_id
from (select distinct user_id, year(date) as yyyy
from t
where date >= '2018-01-01' and
date < '2021-01-01'
) uy
group by user_id
having count(*) = 3;
子查询在指定的范围内,每个user_id
和年份返回一行。外部查询返回具有全部三行的所有用户ID。
您实际上并不需要子查询。我只是觉得这样的逻辑更容易遵循:
select user_id
from t
where date >= '2018-01-01' and
date < '2021-01-01'
group by user_id
having count(distinct year(date)) = 3;