Интересная проблема сортировки SQL - PullRequest
3 голосов
/ 06 мая 2010

Настало время кризиса, последний контракт для моего последнего контракта наступает через два дня, и почти все готово и работает нормально (стук по дереву), за исключением одного выпуска.

В одной из моих хранимых процедур мне нужно вернуть набор результатов следующим образом.

group_id      name
--------      --------
A101          Craig
A102          Craig
Z101          Craig
Z102          Craig
A101          Jim
A102          Jim
Z101          Jim
Z102          Jim
B101          Andy
B102          Andy
Z101          Andy
Z102          Andy

Имена должны быть отсортированы по первому символу идентификатора группы, а также включать записи Z101 / Z102. Сортируя строго по идентификатору группы, я получаю следующий набор результатов:

group_id      name
--------      --------
A101          Craig
A102          Craig
A101          Jim
A102          Jim
B101          Andy
B102          Andy
Z101          Andy
Z102          Andy
Z101          Craig
Z102          Craig
Z101          Jim
Z102          Jim

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

Заранее большое спасибо.

Редактировать: Позвольте мне расширить :) Извините, уже поздно, и я накачиваю кофе.

Приведенный выше набор результатов является особым случаем для особого типа ввода данных. Будучи прозрачным, мы создаем веб-сайт, основанный на выборах, и это будут кандидаты, отсортированные по должности, имени и району.

В большинстве офисов есть несколько округов, за исключением районных должностей, таких как магистрат / коронер, в которых будет только один район. Z выступает в качестве «округа» для заочных машин и заочных бумажных голосов.

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

Чтобы защитить свою гордость, я хочу добавить, что я не контролировал нормализацию базы данных. Он был передан мне клиентом.

Вот предложение порядка моей хранимой процедуры, если это помогает:

    ORDER BY    candidate.party,
            candidate.ballot_name,  
CASE WHEN       candidate.district_type = 'MAG' THEN LEFT(votecount.precinct_id, 1) END,
        candidate.last_name,
        candidate.first_name,
        precinct.name

Редактировать 2 : Вот где я сейчас нахожусь (1:43 А.М.) -

Я использую приведенное ниже предложение для создания условного внутреннего соединения следующим образом:

    IF          candidate.district_type = 'MAG'
BEGIN
    (
        SELECT candidate.id AS candidate_id, candidate.last_name, LEFT(votecount.precinct_id, 1) AS district, votecount.precinct_id
        FROM candidate
        INNER JOIN votecount
        ON votecount.candidate_id = candidate.id
        GROUP BY name
    ) mag_order
    INNER JOIN      mag_order
    ON              mag_order.candidate_id = candidate.id
END

, а затем я отсортирую его по mag_order.district, кандидат.precinct_id, Кандидат.Last_name.

По какой-то причине я получаю ошибку SQL при совмещении (SELECT) как mag_order. Кто-нибудь видит что-то не так с кодом? Я не могу ради своей жизни. Извините, это немного тангенциально.

Ответы [ 3 ]

1 голос
/ 06 мая 2010
SELECT g1.group_id, g1.name
FROM 
    groups g1
        INNER JOIN
    (
        SELECT  MIN(group_id), name
        FROM groups
        GROUP BY name
    ) g2 on g1.name = g2.name
ORDER BY g2.group_id, g1.name, g1.group_id
0 голосов
/ 06 мая 2010
SELECT groupId, name
FROM table
ORDER BY getFirstGroupId(name), name, groupId

Тогда ваша функция getFirstGroupId () вернет первый идентификатор группы для этого имени

SELECT MIN(groupId)
FROM groupTable
WHERE name = @name
0 голосов
/ 06 мая 2010

ЗАКАЗАТЬ ПО ИМЯ DESC, SUBSTR (group_id, 1), group_id

...