简体   繁体   English

PostgreSQL存储过程:如何枚举查询

[英]PostgreSQL stored procedure: how enumerate query

I am trying to execute a query where I pass the 'seasson' and it shows me, as a result, information related with drivers, points , constructor and position in the ranking. 我试图执行一个查询,让我通过“季节”,结果显示了与驱动程序,积分,构造函数和排名中的位置有关的信息。

What I want is to have something like this: 我想要的是这样的东西:

POS IN RANKING | DRIVER NAME | CONSTRUCTOR NAME | POINTS
---------------------------------------------------------
    1           "Hamilton"     MC Laren         360
    2           "Alonso"       Ferrari          290
   ...                 ...                   ....

The problema I get is that I cannot enumerate the rows. 我得到的问题是我无法枚举行。 I think "POS IN RANKING" should come as a result of the function row_number(), but for some reasson I cannot make it work. 我认为“ POS IN RANKING”应该是功能row_number()的结果,但是由于某种原因,我无法使其正常工作。

This is my stored function: 这是我存储的功能:

CREATE TYPE ranking_t AS (
pos integer,
driver character varying(30),
constructor character varying(30),
points integer
);

CREATE OR REPLACE FUNCTION pra2.GetRankingOfPilots(sea pra2.season.name%type)
RETURNS ranking_t AS $$
DECLARE
    ranking_pilots ranking_t;
BEGIN
    SELECT  
      row_number() OVER (ORDER BY totalpuntos),
      driver.name driver, 
      constructor.name constructor,
      season.name season,
      CAST(sum(runs.points) AS int) TotalPuntos
    INTO ranking_pilots
    FROM 
      pra2.hired hired
    INNER JOIN pra2.constructor on  hired.name_constructor = pra2.constructor.name
    INNER JOIN pra2.driver on hired.num_driver = pra2.driver.num
    INNER JOIN pra2.runs on pra2.driver.num=pra2.runs.num_driver
    INNER JOIN pra2.race on pra2.runs.name_race=pra2.race.name AND pra2.runs.season_fk=pra2.race.season_fk AND pra2.runs.season_fk=pra2.race.season_fk
    INNER JOIN pra2.season on hired.name_season=pra2.season.name AND pra2.race.season_fk=pra2.season.name
    WHERE
        pra2.season.name=sea
    GROUP BY
        season,driver,constructor
    ORDER BY
        TotalPuntos Desc;

END; 
$$ 
LANGUAGE plpgsql;

I would appreciate any advice. 我将不胜感激任何建议。

Thank you in advance! 先感谢您!

Get the row numbers in a wrapper query. 包装器查询中获取行号。

Also: change the return type to SETOF ranking_t , remove the variable and use RETURN QUERY . 另外:将返回类型更改为SETOF ranking_t ,删除变量并使用RETURN QUERY

CREATE OR REPLACE FUNCTION pra2.GetRankingOfPilots(sea pra2.season.name%type)
RETURNS SETOF ranking_t AS $$
BEGIN
    RETURN QUERY
    SELECT row_number() OVER (ORDER BY totalpuntos)::int, *
    FROM (
        SELECT  
            driver.name driver, 
            constructor.name constructor,
            season.name season,
            CAST(sum(runs.points) AS int) TotalPuntos
        FROM 
            pra2.hired hired
        INNER JOIN pra2.constructor on  hired.name_constructor = pra2.constructor.name
        INNER JOIN pra2.driver on hired.num_driver = pra2.driver.num
        INNER JOIN pra2.runs on pra2.driver.num=pra2.runs.num_driver
        INNER JOIN pra2.race on pra2.runs.name_race=pra2.race.name AND pra2.runs.season_fk=pra2.race.season_fk AND pra2.runs.season_fk=pra2.race.season_fk
        INNER JOIN pra2.season on hired.name_season=pra2.season.name AND pra2.race.season_fk=pra2.season.name
        WHERE
            pra2.season.name=sea
        GROUP BY
            season,driver,constructor
        ) s
    ORDER BY
        TotalPuntos Desc;
END; 
$$ 
LANGUAGE plpgsql;

I guess the problem is you are using the alias instead of the source. 我想问题是您在使用别名而不是源。

You cant do this 你不能这样做

SELECT 
  row_number() OVER (ORDER BY totalpuntos),
  CAST(sum(runs.points) AS int) TotalPuntos

So you create a sub query 所以你创建一个子查询

SELECT row_number() OVER (ORDER BY totalpuntos)
FROM ( SELECT   CAST(sum(runs.points) AS int) TotalPuntos
       From YourQuery
     ) as Subquery

Maybe you can use the function, but inside a OVER not sure if possible. 也许可以使用该功能,但是不确定是否可以在OVER使用。

SELECT 
  row_number() OVER (ORDER BY CAST(sum(runs.points) AS int)),

EDIT: For return a table you do like this 编辑:对于返回表,您这样做

CREATE OR REPLACE FUNCTION foo(a int)
RETURNS TABLE(b int, c int) AS $$
BEGIN
  RETURN QUERY SELECT i, i+1 FROM generate_series(1, a) g(i);
END;
$$ LANGUAGE plpgsql;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM