#sql #presto
Вопрос:
У меня есть таблица квадроключей, и я хочу найти самые короткие уникальные квадроключевые ключи, которые являются подстроками других (в частности, там, где другие значения начинаются с этих значений квадроключей), т. Е. Самые большие, содержащие плитки Bing. Как я могу это сделать? Моей первой мыслью было сгенерировать все возможные подстроки для уровней масштабирования, которые я использую, просто создав столбец для каждой длины и ища самые короткие уникальные подстроки, но я не уверен, как на самом деле выполнить сравнение. Рассмотрим следующий пример:
У меня есть стол, который выглядит так
квадрокоптер |
---|
121310 |
12131022 |
1213102 |
00321023 |
0032102 |
Я использовал запрос для создания следующей таблицы (которая может даже не быть полезной, но я думал, что это может быть)
original_quadkey | quadkey_6 | quadkey_7 | quadkey_8 |
---|---|---|---|
121310 | 121310 | нулевой | нулевой |
12131022 | 121310 | 1213102 | 12131022 |
1213102 | 121310 | 1213102 | нулевой |
00321023 | 003210 | 0032102 | 00321023 |
0032102 | 003210 | 0032102 | нулевой |
Я хочу сохранить самые короткие уникальные значения и отбросить строки с более длинными значениями original_quadkey, которые содержат эти «самые короткие уникальные значения» в качестве подстрок. В этом случае я бы хотел сохранить 121310 и 0032102, а остальные строки, начинающиеся с 121310 или 0032102, удалить. Как я могу запросить любую из этих таблиц для достижения этой цели? Мне придется сделать это для миллионов строк, так что это потенциально усложнит эту проблему.
Комментарии:
1. Отредактируйте свой вопрос и покажите результаты, которые вы хотите.
Ответ №1:
Если я правильно понимаю, вы можете использовать коррелированный подзапрос:
select t.*,
(select t2.quadkey
from t t2
where t.quadkey like t2.quadkey || '%'
order by t2.quadkey asc
limit 1
) as shortest_quadkey
from t;
При большом объеме данных это привело бы к очень низкой производительности.