包含字段中值的连接、分组和计数的 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 视图的主要内容,如果未能解决你的问题,请参考以下文章