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? Работать с массивами здесь не так сложно.
- Или есть другой способ получить временный результат, который я затем смогу запросить?
Спасибо за предложения.