Postgresql: повторять запрос много раз с разными параметрами - более чистый метод, чем объединения? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь повторить тот же запрос с другими параметрами. Я могу написать это с помощью нескольких операторов объединения, но надеюсь, что есть способ написать функцию для более чистого кода. Спасибо!

Запрос, который мне нужно повторить:

SELECT
  'marker_1'       AS marker,
  b.marker_1       AS results,
  COUNT(DISTINCT b.key_id) AS number_of_results,
  COUNT(DISTINCT b.key_id) * 100 / SUM(COUNT(DISTINCT b.key_id))
  OVER ()         AS percentage
FROM main_table a
  JOIN main_table_marker_results b ON b.key_id = a.id
WHERE a.is_marker = 'true'
GROUP BY marker, marker_1
UNION
SELECT
  'marker_xyz'       AS marker,
  b.marker_xyz       AS results,
  COUNT(DISTINCT b.key_id) AS number_of_results,
  COUNT(DISTINCT b.key_id) * 100 / SUM(COUNT(DISTINCT b.key_id))
  OVER ()         AS percentage
FROM main_table a
  JOIN main_table_marker_results b ON b.key_id = a.id
WHERE a.is_marker_xyz = 'true'
GROUP BY marker, marker_xyz

Мне нужно сделать это примерно для 20 разных маркеров. Кто-нибудь знает способ l oop этот запрос с разными параметрами? Переменные, которые могут измениться, - это маркер и результаты. Есть 20 разных маркеров, все с разными именами (обозначены в этом запросе «marker_1»), которые имеют свой собственный столбец. В столбце содержится результат для этого маркера, поэтому "результат" этого запроса может быть {положительным, отрицательным, неопределенным}.

Окончательный результат должен выглядеть так:

marker      result         number_of_results   percentage
marker_1    positive        350                 49.5
marker_1    negative        48                  6.8
marker_1    undetermined    309                 43.7
marker_xyz  positive        500                 80.0
marker_xyz  negative        25                  4.00
marker_xyz  undetermined    100                 16.00

1 Ответ

1 голос
/ 09 июля 2020

Я не совсем уверен, но я думаю, что это должно достичь того, чего вы хотите:

SELECT x.marker,
       x.result,
       COUNT(DISTINCT b.key_id) AS number_of_results,
       COUNT(DISTINCT b.key_id) * 100 / SUM(COUNT(DISTINCT b.key_id))
       OVER ()         AS percentage
FROM main_table a
  JOIN main_table_marker_results b ON b.key_id = a.id
  JOIN LATERAL (
    values 
     ('{"is_marker_1": true}'::jsonb, 'marker_1', marker_1), 
     ('{"is_marker_2": true}'::jsonb, 'marker_2', marker_2),
     ('{"is_marker_xyz": true}'::jsonb, 'marker_xyz', marker_xyz)
  ) as x(condition, marker, result) ON to_jsonb(a) @> condition
GROUP BY x.marker, x.result;

Обратите внимание, что ключ в константе JSONB должен точно соответствовать имени столбца в вашей таблице, иначе это выиграет ' т работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...