DAY1-SQL题目和窗口函数
一、题目:查找连续五天登录的用户
表:user_logins
字段:user_id/login_date
SELECT user_id
FROM (
SELECT
user_id,
login_date,
lead (login_date, 4) OVER (PARTITION BY user_id ORDER BY login_date) AS end_date
FROM user_logins
) AS date_range
WHERE datediff (end_date, login_date) = 4;
这个查询使用了窗口函数lead(),它用于获取当前行后的登录日期。在这里,我们使用LEAD(login_date, 4)来获取每个用户的登录日期后的第五天。
然后,我们使用DATEDIFF()函数来计算两个日期之间的天数差异。如果差异为4,说明存在连续的五天登录。
😎:新学两个函数
lead(字段,n)——用来获取当前行后面n个的内容
datediff(字段,字段)——计算两个日期之间的差值
二、窗口函数
1.ROW_NUMBER( ): 给结果集中的每一行分配一个唯一的数字,通常用于排序。
ROW_NUMBER() OVER (ORDER BY column_name);
2.RANK( ): 为结果集中的每一行分配一个排名,相同值将得到相同的排名,但可能跳过其他排名。
RANK() OVER (ORDER BY column_name);
3.DENSE_RANK( ): 为结果集中的每一行分配一个排名,相同值将得到相同的排名,不会跳过其他排名。
DENSE_RANK() OVER (ORDER BY column_name);
4.SUM( ) OVER( ): 计算窗口中某列的累积和。
SUM(column_name) OVER (PARTITION BY partition_column ORDER BY order_column);
5.AVG( ) OVER( ): 计算窗口中某列的平均值。
AVG(column_name) OVER (PARTITION BY partition_column ORDER BY order_column);
6.LEAD( ): 获取窗口中当前行后的值。
LEAD(column_name, offset, default_value) OVER (ORDER BY order_column);
7.LAG( ): 获取窗口中当前行前的值。
LAG(column_name, offset, default_value) OVER (ORDER BY order_column);