SQL架构
表: Views
+---------------+---------+ | Column Name | Type | +---------------+---------+ | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | +---------------+---------+ 此表无主键,因此可能会存在重复行。 此表的每一行都表示某人在某天浏览了某位作者的某篇文章。 请注意,同一人的 author_id 和 viewer_id 是相同的。
编写一条 SQL 查询来找出在同一天阅读至少两篇文章的人。
结果按照 id
升序排序。
查询结果的格式如下。
示例 1:
输入: Views 表: +------------+-----------+-----------+------------+ | article_id | author_id | viewer_id | view_date | +------------+-----------+-----------+------------+ | 1 | 3 | 5 | 2019-08-01 | | 3 | 4 | 5 | 2019-08-01 | | 1 | 3 | 6 | 2019-08-02 | | 2 | 7 | 7 | 2019-08-01 | | 2 | 7 | 6 | 2019-08-02 | | 4 | 7 | 1 | 2019-07-22 | | 3 | 4 | 4 | 2019-07-21 | | 3 | 4 | 4 | 2019-07-21 | +------------+-----------+-----------+------------+ 输出: +------+ | id | +------+ | 5 | | 6 | +------+
select
distinct viewer_id id
from
Views
group by
viewer_id,view_date
having count(distinct article_id)>=2
order by id
笔记:
用rank进行标号 然后 用 其标号>多少 过滤重复值
因为article_id 可能有重复,例如
| 3 | 4 | 4 | 2019-07-21 |
| 3 | 4 | 4 | 2019-07-21 |
所以我们想要去重,但是如果在窗口函数中写入distinct会报错,
报错!!!
select distinct viewer_id as id from
(
select *,
count(distinct article_id) over(partition by view_date,viewer_id) as counts
from Views
) tmp
where counts >1
order by viewer_id
报错!!!
这个时候怎么办呢?
我们只需要改变思路,使用rank 窗口函数,问题解决~
select distinct viewer_id as id from
(
select *,
rank() over(partition by view_date,viewer_id order by article_id) as ranks
from Views
) tmp
where ranks >1
order by viewer_id