Получение первого из предложения GROUP BY в SQL - PullRequest
2 голосов
/ 02 апреля 2010

Я пытаюсь реализовать регионализацию с одним столбцом для приложения 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 упорядоченных групп?

1 Ответ

0 голосов
/ 02 апреля 2010

Только первая запись или только первая группа записей? Из того, что вы написали, даже не ясно, существует ли более одной записи или нет.

В любом случае, кажется, что вы наклоняетесь назад, чтобы сделать это в одном запросе, но структура базы данных не оптимизирована для этого. Если есть только 3 уровня, и вы хотите самый конкретный, почему бы просто:

SELECT * FROM my_table WHERE region = 'us' GROUP BY external_id

Если это что-то возвращает, остановитесь, в противном случае вы выполняете еще 1 или 2 запроса условно.

Я могу ошибаться, но мой инстинкт говорит, что это даст гораздо лучшую общую производительность, хотя я полагаю, что это зависит от особенностей вашей БД.

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