Самый оптимальный способ расставить приоритеты записей на основе битовых столбцов - PullRequest
0 голосов
/ 06 апреля 2019

Существует связь «1 ко многим» между таблицами GeoNames (не показаны) и GeoNameAlternateNames (показаны ниже) с помощью FK GeoNameId. Учитывая приведенную ниже структуру, я хочу получить значение alternateName, где IsPreferredName = 1, если оно не найдено, тогда используйте следующий столбец IsShortName, если эта запись не найдена, то используйте следующий столбец и так далее, и так далее. В этом случае я ожидаю, что будет возвращен верхний ряд. Помните, что я буду присоединяться к этой таблице из таблицы GeoNames.

В GeoNames более 11 миллионов + записей и в GeoNamesAlternateNames более 17 миллионов, поэтому, как неандерталец, это не приемлемое решение.

Какая стратегия лучше всего подходит для этого? Я пробовал группировать, оставлял объединение в каждой колонке и объединял, ранжировал в подстолы, и я собираюсь вырвать свои волосы. Заранее спасибо.

enter image description here

1 Ответ

1 голос
/ 06 апреля 2019

Это запрос расстановки приоритетов.Вы хотите одну строку на geonameid, поэтому используйте row_number() с соответствующим предложением order by:

select t.*
from (select t.*,
             row_number() over (partition by geonameid
                                order by (case when IsPreferredName = 1 then 1
                                               when IsShortName = 1 then 2
                                               . . .
                                          end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
...