Summary:我有按计数分组、计数和排序的数据.我只想保留前X行,并将其他行累积为名为"Other"的行

下面的数据是available at DB Fiddle

CREATE TABLE cities (name TEXT);
INSERT INTO cities(name) VALUES ('paris'), ('paris'), ( 'london'), ( 'london'), ( 'london'), ( 'london'), ( 'rome'), ( 'madrid');

SELECT name, COUNT(name) AS count FROM cities
GROUP BY name
ORDER BY count DESC
LIMIT 2

上面的代码生成前两个最常用的城市(条目数量最多的城市):

| name   | count |
| ------ | ----- |
| london | 4     |
| paris  | 2     |

我想要实现的是

| name   | count |
| ------ | ----- |
| london | 4     |
| paris  | 2     |
| other  | 2     |

其中所有剩余的行(在我的例子中是'rome''madrid')一起分组到other下.

我对SQL不是很了解,但在伪代码中,我考虑的内容如下

SELECT name, COUNT(name) AS count FROM cities
GROUP BY name
ORDER BY count DESC
LIMIT 2 AS top_2
LIMIT 2+ AS other

这可能在一次通过中实现吗?作为一种变通办法,我将有相同的查询,但排序方式相反,并且限制为"行数-前2个"(所以我认为总共有3个查询).

(I am surprised that this has not been asked before, but could not find a match)

推荐答案

一种 Select 是将另一个级别的聚合与row_number函数上的CASE表达式一起使用:

WITH T AS
(
  SELECT
     name, 
     COUNT(name) AS count,
     ROW_NUMBER() OVER (ORDER BY COUNT(name) DESC) AS rn 
  FROM cities
  GROUP BY name
  ORDER BY count DESC
)
SELECT 
   CASE 
     WHEN rn IN (1, 2) 
     THEN name 
     ELSE 'Others' 
   END AS name,
   SUM(count) AS count
FROM T
GROUP BY 1
ORDER BY count DESC

要确保‘Other’出现在结果集中的最后,您可以

Demo

Sql相关问答推荐

如何实现一个广泛的多级自连接PostgreSQL查询?

SQL查询组类值在同一行中,并连接和排序其他值

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

如何利用单列历史SQLsnowflake获得合并结果

最近3个月收到的邮箱总数

SQL计数条目大于日期,包括交叉表中的零

在SQL Server中设置关联对象的有效JSON格式

Select 列组(按同一表格中的另一列分组)Laravel 10

用于SQL协助的XQUERY()

统计PostgreSQL中前10个最大大小表的行数

将用户授予另一个用户不授予权限

MySQL中的递归查询邻接表深度优先?

连续天跟踪购买情况(将标记返回到另一列?)

创建具有多个子查询的 SQL 视图

避免在SQL中使用具有相同条件的多个子查询

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

如何显示最常引用条目的详细信息

有条件求和

从不同的表中 Select 包含单词列表的记录

SQL 中的问题与包含最大日期的记录连接