Postgresql查询使用递归和selfjoin

时间:2015-05-20 19:08:28

标签: sql postgresql common-table-expression recursive-query

我有一项任务,我遇到一个问题。基本上我有一张下面的表格。亚历克斯是一名球员,桌上展示了他每个赛季都参加过的球队。请注意,季节从特定年份开始,到次年结束。我只需要使用SQL(没有游标)来产生输出,如第二张表中所示,Alex的职业生涯只显示在两行中,而第一张表中Alex的职业生涯则以四行显示。

我几乎没有尝试解决这个问题,但无法理解如何在第二个表中生成输出。我可以感觉到我必须使用CTE,因为我可以看到Year_End等于下一行的Year_Start。我也曾试图在网上进行研究,但由于这是一个非常具体的问题,我找不到任何相关的解决方案。到目前为止,我还发布了我的查询,因为我认为我走在正确的轨道上,但现在我已经卡住了。

**TABLE records**
Id   | Name | Team_Name    | Year_Start |  Year_End
---------------------------------------------------
100  | Alex | New Team     | 2010       |  2011
101  | Alex | New Team     | 2011       |  2012
102  | Alex | Best Eleven  | 2012       |  2013
103  | Alex | Best Eleven  | 2013       |  2014

**Required result from query**
Name  | Team Name   | Year_Start | Year_End
-------------------------------------------
Alex  | New Team    | 2010       | 2012
Alex  | Best Eleven | 2012       | 2014

我的查询到目前为止......

WITH RECURSIVE cte(id, name, team_name, year_start, year_end) AS
(
    SELECT  *
    FROM    history
    WHERE   name = 'Alex'

    UNION ALL

    SELECT  history.id, history.name, history.team_name, history.year_start, history.year_end
    FROM    cte, history
    WHERE   cte.year_start = history.year_end 
)
    SELECT  *
    FROM    cte;

产生请求结果的查询。

WITH RECURSIVE cte(id, name, team_name, year_start, year_end) AS
(
    SELECT  *
    FROM    history
    WHERE   name = 'Alex'

    UNION ALL

    SELECT  history.id, history.name, history.team_name, history.year_start, history.year_end
    FROM    cte, history
    WHERE   cte.year_start = history.year_end 

)
    SELECT  team_name, MIN(year_start), MAX(year_end)
    FROM    cte
    GROUP BY team_name;

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询来获得所需的结果

Sample SQL Fiddle

Select Distinct t.Name,t.Team_Name,b.YStart,b.YEnd 
FROM t INNER JOIN(
              Select Team_Name, Min(Year_Start) YStart,Max(Year_End) YEnd
              FROM t
              Group BY Team_Name ) b
ON t.Team_Name = b.Team_Name

答案 1 :(得分:-1)

select Name, Team_Name, min(Year_Start) startY, max(Year_End) endY
from t group by Name, Team_Name