1149. 文章浏览 II

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值