问题: 现有用户登录记录表,请查询出用户连续三天登录的所有数据记录
id dt
1 2024-04-25
1 2024-04-26
1 2024-04-27
1 2024-04-28
1 2024-04-30
1 2024-05-01
1 2024-05-02
1 2024-05-04
1 2024-05-05
2 2024-04-25
2 2024-04-28
2 2024-05-02
2 2024-05-03
2 2024-05-04
期望结果:
解析:
- 功能 :从
t3
中选择并返回所有符合条件的记录的dt
列。t3
中的记录是那些具有符合条件的chajv
值的行。(为了防止不同月份出现相同的差值而被分到一组,可以将id加入运算)
总结:
- 步骤 1 (
t
) :为每个id
内的记录生成按dt
排序的排名。 - 步骤 2 (
t1
) :计算一个新的字段chajv
,其值是dt
中的日部分与id(可以扩大一些倍数防止不同月份的重复)
和排名值的计算结果。 - 步骤 3 (
t2
) :统计每个id
和chajv
组合出现的次数,保留那些出现次数大于或等于 3 次的组合。 - 步骤 4 (
t3
) :从t1
中筛选出那些chajv
值在t2
中的记录。 - 最终查询 :返回这些记录中的
dt
列。
建表语句:
sql
CREATE TABLE wo22 (
id INT,
dt STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '; -- 假设数据是逗号分隔的
LOAD DATA LOCAL INPATH '/home/wo20.txt' INTO TABLE wo22;
sql
with t as (
select * ,row_number() over (partition by id order by dt) paim from wo22
),t1 as (
select *, cast(substr(dt,9,2) as int)+cast(id as int)-paim chajv from t
),t2 as (
select id,chajv,count(1) day from t1 group by id,chajv having day>=3)
,t3 as (
select * from t1 where t1.chajv in (select chajv from t2)
)select dt from t3