Загрузка значений во временный контейнер для агрегирования и сравнения в Postgres - PullRequest
1 голос
/ 02 мая 2020

Postgres 11.5 и 11.7.

У меня есть стратегический вопрос, с которым я надеюсь получить какое-то направление. Я создаю серию партитур и методов. Оттуда я бы хотел найти минимальное, максимальное и среднее значение баллов. И из них я хотел бы получить название метода, который дал лучший результат.

Вот пример запроса с использованием pg_similarity и пользовательской версии monge_elkan. Но это совершенно не связано с вопросом, это пример того, «как мне поместить sh наборов значений в что-то для агрегирования и сравнения?» Походит на CTE, но я не уверен, как создать это в этом случае.

WITH
basic_scores AS (
          select monge_elkan('1 West Extra King Ret.','Tray Extra King Plush') AS monge_elkan_score,
          sqrt(monge_elkan('1 West Extra King Ret.','Tray Extra King Plush'))  AS monge_elkan_quad_score,

          jaccard('1 West Extra King Ret.','Tray Extra King Plush')            AS jaccard_coefficient,
          jaccard('1 West Extra King Ret.','Tray Extra King Plush') * 0.3      AS jaccard_handicap,

          qgram('1 West Extra King Ret.','Tray Extra King Plush')              AS qgram_score,
          similarity('1 West Extra King Ret.','Tray Extra King Plush')         AS trigram_score,
          word_similarity('1 West Extra King Ret.','Tray Extra King Plush')    AS word_score,

          lev('1 West Extra King Ret.','Tray Extra King Plush')                AS levenshtein_distance,
          jaro('1 West Extra King Ret.','Tray Extra King Plush')               AS jaro_distance,
          jarowinkler('1 West Extra King Ret.','Tray Extra King Plush')        AS jaro_winkler_distance
),

extended_scores AS (
select  monge_elkan_score::float8,
        (monge_elkan_score - jaccard_handicap)::float8 AS monge_elkan_handicap_score,
        monge_elkan_quad_score::float8,
        (monge_elkan_quad_score - jaccard_handicap)::float8 AS monge_elkan_quad_handicap_score,           

        jaccard_coefficient,
        jaccard_handicap,

        qgram_score::float8,
        trigram_score::float8,
        word_score::float8,

        levenshtein_distance::float8,
        jaro_distance::float8,
        jaro_winkler_distance::float8

  from basic_scores)

select 

greatest(monge_elkan_score, monge_elkan_handicap_score, monge_elkan_quad_score, monge_elkan_quad_handicap_score,           
qgram_score, trigram_score, word_score, levenshtein_distance, jaro_distance, jaro_winkler_distance),

least(monge_elkan_score, monge_elkan_handicap_score, monge_elkan_quad_score, monge_elkan_quad_handicap_score,           
qgram_score, trigram_score, word_score, levenshtein_distance, jaro_distance, jaro_winkler_distance),

* from extended_scores

Вручную, вот вывод:

greatest                          0.80829036
least                             0.34375
monge_elkan_score                 0.653333306
monge_elkan_handicap_score        0.567619021
monge_elkan_quad_score            0.80829036
monge_elkan_quad_handicap_score   0.722576074
jaccard_coefficient               0.285714286
jaccard_handicap                  0.085714286
qgram_score                       0.425531915
trigram_score                     0.34375
word_score                        0.5
levenshtein_distance              0.5
jaro_distance                     0.672438672
jaro_winkler_distance             0.672438672

Победитель, в этом случае monge_elkan_quad_score со значением 0.80829036. Я могу разобраться в этом с огромным CASE, но должен быть более хороший способ. Я не ожидаю, что кто-нибудь напишет мне код, но немного псевдокода, чтобы вы * sh в правильном направлении, было бы здорово. Я думал о

  • Массив с элементами ['measure',score], такими как ['monge_elkan_score',0.653333306] и так далее. Это, я не знаю, как написать в SQL.
  • Временную таблицу .... но что-то в моих мыслях вещи медленные и / или дорогие?
  • Это проще построить его в PL / Pg SQL? Работать с массивами здесь не так сложно.
  • Или есть другой способ получить временный результат, который я затем смогу запросить?

Спасибо за предложения.

...