首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化postgresql数据库视图查询

优化postgresql数据库视图查询
EN

Database Administration用户
提问于 2019-08-14 22:08:07
回答 1查看 95关注 0票数 0

考虑到以下数据库模式(使用类似于rails的关联,因为这是一个rails项目,也请原谅我如何表达这个论坛的新成员):

代码语言:javascript
复制
Client has_many Deals (0 to many)
Deal has_many DealStages (1 to many)
DealStage belongs_to Stage

其中Stage有一个属性position:integerDealStage有一个属性current:boolean,只有一个DealStage可以标记为current = true

我试图得到每个客户的最高阶段的位置,最终目标是过滤一组客户的阶段ID。目前阶段的每笔交易是由任何DealStage标记为当前。这就是我为实现这一目标所做的工作:

代码语言:javascript
复制
  CREATE VIEW client_max_stages AS
    WITH client_max_stage_positions AS
    (
      SELECT DISTINCT clients.id AS client_id, max(stages.position) AS position
      FROM clients
      INNER JOIN deals ON deals.client_id = clients.id
      INNER JOIN deal_stages ON deal_stages.deal_id = deals.id
      INNER JOIN stages ON stages.id = deal_stages.stage_id
      WHERE deal_stages.current = true AND deals.is_active = true
      GROUP BY clients.id
    )
    SELECT DISTINCT client_max_stage_positions.client_id, stages.id AS stage_id
    FROM client_max_stage_positions
    INNER JOIN deals ON deals.client_id = client_max_stage_positions.client_id
    INNER JOIN deal_stages ON deal_stages.deal_id = deals.id
    INNER JOIN stages ON stages.id = deal_stages.stage_id
    WHERE stages.position = client_max_stage_positions.position;

我坚信这可以在某种程度上得到优化,但这让我得到所有的客户按最大阶段分组,然后每个客户端的ID为它的最高阶段。

EN

回答 1

Database Administration用户

发布于 2019-08-15 06:36:01

你似乎需要做一些类似于:

代码语言:javascript
复制
WITH cte AS ( SELECT *, 
                     RANK() OVER (PARTITION BY clients.id 
                                  ORDER BY stages.position DESC) rnk
              FROM clients
              INNER JOIN deals ON deals.client_id = clients.id
              INNER JOIN deal_stages ON deal_stages.deal_id = deals.id
              INNER JOIN stages ON stages.id = deal_stages.stage_id
              WHERE deal_stages.current = true AND deals.is_active = true )
SELECT *
FROM cte 
WHERE rnk=1

PS。张贴作为答复,因为它太长,不能发表评论。

PPS。我不确定,因为在CTE中哪里存在,在主查询中不存在。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/245377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档