sqlite 选择前N行中具有值的所有行

zy1mlcev  于 2023-01-21  发布在  SQLite
关注(0)|答案(2)|浏览(151)

请看下面这个简单的事件计数表:
| 事件名称|计数|
| - ------|- ------|
| 视图已加载|二十个|
| 视图已卸载|十七|
| 按钮攻丝|十二|
| 视图滚动|十二|
| 网络成功|九|
| 已连接|九|
| 网络故障|第二章|
| 闰秒|无|
我想按计数选择前N个事件,但有一个额外的要求,即如果结果集包含具有特定计数的 * 任何 * 事件,那么它应该包含具有该计数的 * 所有 * 事件。换句话说,我不想拆分任何具有相同计数的行"组"。相反,我可能会得到比我要求的更多的行。
例如,如果我想要上表中的"前五个"事件,查询实际上将返回六行,这样计数为9的两个事件都包括在内。前四个事件的查询将返回四行,前三个事件的查询也将返回四行。
我如何在SQLite中实现这一点?

atmip9wb

atmip9wb1#

您可以使用RANK窗口函数来完成此任务。对于相同的值,它的排名值将相等,但在需要分配下一个排名时将考虑过去的行数。

WITH cte AS (
    SELECT *, RANK() OVER(ORDER BY count_ DESC) AS rn
    FROM events
)
SELECT event_name, count_ FROM cte WHERE rn <= 5

检查here演示。

yv5phkfx

yv5phkfx2#

一种方法是使用公用表表达式来标识与“前五个”事件相对应的计数:

with top_five as (
    select count from events order by count desc limit 5
)
select * from events where count in top_five order by count desc;

相关问题