包含字段中值的连接、分组和计数的 SQL 视图

Posted

技术标签:

【中文标题】包含字段中值的连接、分组和计数的 SQL 视图【英文标题】:SQL View with Joins, Grouping, and Counts of a value in a field 【发布时间】:2012-04-23 20:59:20 【问题描述】:

我们的目标是最终获得一个视图,该视图显示了每种类型和专业组合的 50 个最常见的程序代码。 (特殊代码可以在不同类型中重复)

我有两张桌子:

providers 包含: 提供者类型 提供者专业 provider_id (以及一些与这个问题无关的数据)

services 包含: provider_id 程序代码 (以及其他一些数据点 - 不相关)

最终结果如下所示:

Provider Type  |  Provider Specialty |  Procedure Code  |  Count
---------------+---------------------+------------------+-------
00             |  01                 | 97012            |  500 
00             |  01                 | 97013            |  450
00             |  02                 | 97012            |  270
00             |  02                 | 97013            |  900
01             |  01                 | 97012            |  845
01             |  01                 | 97013            |  1200

有什么想法吗?我知道这是一个超级复杂的查询,我考虑过构建一个脚本来执行更新周期,但我宁愿拥有更多的实时数据。

【问题讨论】:

那么你的表中的程序代码在哪里? 对不起 - 服务代码和程序代码是一回事。已编辑。它们在表中没有不同的名称 - 只是在办公室中互换使用。 针对每个单独的类型和专业,还是针对每个类型和专业的组合 类型和专业的结合。对不起!更新中! 【参考方案1】:

每种类型组合的 50 个最常见的程序代码 和专业

应该像这样工作:

WITH x AS (
    SELECT p.provider_type, p.provider_specialty, s.procedure_code
          ,count(*) AS ct
          ,row_number() OVER (PARTITION BY p.provider_type, p.provider_specialty
                              ORDER BY count(*) DESC) AS r
    FROM   providers p
    JOIN   services s USING (provider_id)
    GROUP  BY 1,2,3
    )
SELECT x.provider_type, x.provider_specialty, x.procedure_code, x.ct
FROM   x
WHERE  x.r <= 50
ORDER  BY 1,2,4,3;

要点

我使用 CTE(PostgreSQL 8.4 或更高版本),您可以对子查询执行相同操作。

我使用window function row_number()(同样是PostgreSQL 8.4 或更高版本)来限定procedure_code 中最常见的50 个值。

请注意,您可以在 OVER 子句中使用 ORDER BY count(*)。也就是说,在窗口函数中使用聚合函数的结果,因为窗口函数在聚合函数之后应用

你可以ORDER BY ct做同样的事情,因为窗口函数不知道别名。

那么最后的SELECT就很简单了,只需返回每组的前50名即可。

【讨论】:

这显示了少于 50 个实例的实例。我想展示实例最多的 50 个。抱歉,如果不清楚。不过,我还是要把它保存到另一个视图中,谢谢。 我认为我修正了这个声明。 @JensSchauder:谢谢,应该这样做。

以上是关于包含字段中值的连接、分组和计数的 SQL 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

sql 基础语句

sql中如何按某字段值的首字母分组?

按月分组的运行计数以汇总销售额

将 3 列分组为 1 列并生成计数 SQL

SQL - 计算包含两个不同字段的行数