首页 > 解决方案 > COUNT(*) 作为“A 列”,GROUP BY“A 列”,B 列的第二个顶部

问题描述

您将如何获取显示不同端点(A 列)计数的查询,以及对应于该端点的顶级消费者(B 列)?

以下是一些示例数据:

+----------+------+
| endpoint | user |
+----------+------+
|  /api/a  | usrA |
|  /api/a  | usrA |
|  /api/a  | usrB |
|  /api/b  | usrA |
|  /api/b  | usrB |
|  /api/b  | usrB |
+----------+------+

以及我希望查询结果的样子:

+----------+-------+----------+
| Endpoint | Count | Top User |
+----------+-------+----------+
|  /api/a  |   3   |   usrA   |
|  /api/b  |   3   |   usrB   |
+----------+-------+----------+

这是我到目前为止的查询,但显然是错误的(该MAX函数没有按照我的想法执行):

SELECT
  endpoint as "Endpoint",
  count(*) AS "Count",
  max("user") AS "Top User"
FROM table_a
GROUP BY "Endpoint"
ORDER BY "Count"

我认为我的部分问题是我根本不知道提出这个问题的正确术语,如果我知道了,我也许可以用谷歌搜索我的胜利之路。

标签: sqlpostgresql

解决方案


DISTINCT ON您可以在外部查询中使用特定于 PostgreSQL 的子句来过滤掉除顶级用户之外的所有用户:

SELECT DISTINCT ON (endpoint)
       endpoint, "user", c
FROM (SELECT
        endpoint,
        count(*) AS c,
        "user"
      FROM table_a
      GROUP BY endpoint, "user") AS sub
ORDER BY endpoint, c DESC;

推荐阅读