Я пытаюсь реализовать регионализацию с одним столбцом для приложения Rails, и у меня возникают некоторые серьезные проблемы со сложной потребностью в SQL. Для этой системы регион может быть представлен кодом страны (например, us
), кодом континента, который находится в верхнем регистре (например, NA
), или он может быть NULL
, указывая информацию «по умолчанию». Мне нужно сгруппировать эти элементы по некоторой соответствующей информации, например по внешнему ключу (назовем его external_id
).
Учитывая страну и ее континент, мне нужно иметь возможность выбрать только самый конкретный из доступных регионов. Поэтому, если существуют записи с кодом страны, я выбираю их. Если нет, я хочу записи с кодом континента. Если нет, я хочу записи с кодом NULL
, чтобы я мог получать значения по умолчанию.
До сих пор я полагал, что смогу использовать сгенерированный оператор CASE
для получения произвольного порядка сортировки. Примерно так:
SELECT *, CASE region
WHEN 'us' THEN 1
WHEN 'NA' THEN 2
ELSE 3
END AS region_sort
FROM my_table
WHERE region IN ('us','NA') OR region IS NULL
GROUP BY external_id
ORDER BY region_sort
Проблема в том, что без агрегатной функции фактические данные, возвращаемые GROUP BY
для данной строки, кажутся непостижимыми. Как мне помассировать этот запрос, чтобы он возвращал только первую запись из region_sort
упорядоченных групп?