postgresql - столбец должен появляться в предложении GROUP BY или использоваться в статистической функции.Но я не хочу делать ни одну из этих вещей - PullRequest
0 голосов
/ 18 декабря 2018
select res.*, (res.revision_rank - min(revision_rank)) as blah from
(
select distinct branch, test_type, test_suite, test_plan, test_case, build_age, passed, failed, test_count, min_in_case, revision, has_case_comment::int, has_plan_comment::int, has_suite_comment::int, has_type_comment::int, test_job, initialreport, revision_rank from 
 (select *, MIN(passed) OVER (PARTITION BY branch, test_type, test_suite, test_plan) as min_in_case 
  FROM test_result_by_case_with_comment
  WHERE branch = 'branch' AND REVISION <= 12345 AND (newest_build OR NOT true)) as b1 WHERE min_in_case = 0 OR NOT true
                                                                                        ) as res;

Это дает мне следующую ошибку:

ERROR:  column "res.branch" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select res.*, (res.revision_rank - min(revision_rank)) as bl...

Но это не кажется приемлемым.Мне нужна каждая строка плюс дополнительный столбец для каждой строки, показывающий разницу между revision_rank этой строки и абсолютным минимумом revision_rank.

Мне нужен абсолютный минимум, а не минимум для раздела или внутри группы.Можно ли здесь делать то, что мне нужно?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Примерно так может работать:

WITH temp as (SELECT MIN(revision_rank) as absmin FROM test_result_by_case_with_comment)

    select res.*, (res.revision_rank - temp.absmin) as blah from
    (
    select distinct branch, test_type, test_suite, test_plan, test_case, build_age, passed, failed, test_count, min_in_case, revision, has_case_comment::int, has_plan_comment::int, has_suite_comment::int, has_type_comment::int, test_job, initialreport, revision_rank from 
     (select *, MIN(passed) OVER (PARTITION BY branch, test_type, test_suite, test_plan) as min_in_case 
      FROM test_result_by_case_with_comment
      WHERE branch = 'branch' AND REVISION <= 12345 AND (newest_build OR NOT true)) as b1 WHERE min_in_case = 0 OR NOT true) as res, temp

Идея состоит в том, чтобы сначала просто рассчитать минимум абс, а затем использовать его там, где вам нужно.Обратите внимание на включение temp в неявное соединение.

0 голосов
/ 18 декабря 2018

Ваш текущий запрос (немного упрощенный):

select i, sum(i)
from generate_series(1, 3) g(i);

ERROR:  column "g.i" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select i, sum(i)    

Вы можете использовать агрегат в качестве оконной функции:

select i, sum(i) over ()
from generate_series(1, 3) g(i);

 i | sum 
---+-----
 1 |   6
 2 |   6
 3 |   6
(3 rows)    

или рассчитать агрегат в отдельном запросе:

with query as (
    select i
    from generate_series(1, 3) g(i)
    ),
summary as (
    select sum(i)
    from query
)
select *
from query
cross join summary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...