1

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

我有两张桌子:

providers包含:
provider_type
provider_specialty
provider_id
(以及一些与此问题无关的数据)

services包含:
provider_id
procedure_code
(和其他一些数据点 - 不相关)

最终结果将类似于:

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

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

4

1 回答 1

4

每种类型和专业组合的 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 或更高版本),您可以对子查询执行相同操作。

  • 我使用窗口函数row_number()(同样是 PostgreSQL 8.4 或更高版本)来限定procedure_code.

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

  • 您不能做同样的事情ORDER BY ct,因为窗口函数不知道别名。

  • 决赛SELECT很容易,只需返回每组的前 50 名。

于 2012-04-23T21:32:34.213 回答