PostgreSQL - Поиск наиболее распространенной substring () в массиве - PullRequest
1 голос
/ 03 августа 2020

Мне нужно найти способ определить наиболее распространенную подстроку из массива в PostgreSQL.

У меня есть одномерный массив в столбце в PostgreSQL, в котором хранятся значения CPV (вложенный классификационный словарь - https://simap.ted.europa.eu/cpv). Коды состоят из символов numeri c, но хранятся как varchar, так как некоторые записи имеют начальный ноль, например:

["45331110", "50721000", "45251250", "42160000", "39715000", "45315000", "09323000", "71321200", "45331100", "50720000"]

Я хочу извлечь наиболее распространенные ведущие два цифры из этого массива с использованием PostgreSQL, что в данном примере будет 45.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Если вы хотите получить наиболее часто встречающиеся первые две цифры на строку, вы можете использовать:

WITH data_rows(id, cpv_values) AS (
    VALUES (1, ARRAY ['45331110', '50721000', '45251250','42160000','39715000','45315000', '09323000','71321200','45331100', '50720000'])
         , (2, ARRAY ['50721000']) -- second test case
)
SELECT id, leading_two_digits
FROM data_rows
-- for every row in `data_rows` (your table),
-- select the most common `leading_two_digits` (through GROUP BY/ORDER BY/LIMIT 1)
JOIN LATERAL (
    SELECT left(code, 2) AS leading_two_digits
    FROM unnest(cpv_values) AS f(code)
    GROUP BY left(code, 2)
    ORDER BY COUNT(*) DESC
    LIMIT 1
) s ON true

возвращает

+--+------------------+
|id|leading_two_digits|
+--+------------------+
|1 |45                |
|2 |50                |
+--+------------------+

Если вы хотите получить наиболее распространенные первые две цифры в всех строках, вы можете использовать:

WITH data_rows(cpv_values) AS (
    VALUES (ARRAY ['45331110', '50721000', '45251250','42160000','39715000','45315000', '09323000','71321200','45331100', '50720000']),
           (ARRAY ['45'])
)
SELECT left(code, 2) AS leading_two_digits
FROM data_rows, unnest(cpv_values) AS f(code)
GROUP BY left(code, 2)
ORDER BY COUNT(*) DESC
LIMIT 1
1 голос
/ 03 августа 2020

Этот запрос делает то, что вам нужно.

select substr(t, 1, 2) mc
 from unnest(array['45331110', '50721000', '45251250', '42160000', '39715000', '45315000', '09323000', '71321200', '45331100', '50720000']) t 
 group by mc
 order by count(1) desc
 limit 1;

Результат:

Name|Value|
----|-----|
mc  |45   |

Вы можете использовать th ie выше в качестве подзапроса для извлечения наиболее распространенных подстрок в каждой строке.

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