【问题标题】:SQL View with Joins, Grouping, and Counts of a value in a field包含字段中值的连接、分组和计数的 SQL 视图
【发布时间】: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

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

【问题讨论】:

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

标签: sql postgresql window-functions


【解决方案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:谢谢,应该这样做。
猜你喜欢
  • 2018-06-13
  • 2020-04-06
  • 2016-02-25
  • 2015-08-25
  • 2020-08-26
  • 2015-11-30
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多