Получение репрезентативных записей для уникальных значений одного столбца - PullRequest
0 голосов
/ 16 ноября 2011

Для Postgresql 8.x у меня есть таблица answers, содержащая (id, user_id, question_id, choice), где choice - строковое значение. Мне нужен запрос, который вернет набор записей (все возвращенные столбцы) для всех уникальных значений choice. То, что я ищу, - это одна репрезентативная запись для каждого уникального выбора. Я также хочу иметь совокупный столбец votes, который представляет собой count() числа записей, соответствующих каждому уникальному варианту, сопровождающему каждую запись. Я хочу заставить choice в нижнем регистре сделать это сравнение ( HeLLo и Hello следует считать равными) . Я не могу GROUP BY lower(choice), потому что мне нужны все столбцы в наборе результатов. Группировка по всем столбцам приводит к возврату всех записей, включая все дубликаты.

1. Ближайший я получил

select lower(choice), count(choice) as votes from answers where question_id = 21 group by lower(choice) order by votes desc;

Проблема в том, что он не вернет все столбцы.

                     lower                     | votes 
-----------------------------------------------+-------
 dancing in the moonlight                      |     8
 pumped up kicks                               |     7
 party rock anthem                             |     6
 sexy and i know it                            |     5
 moves like jagger                             |     4

2. Попытка со всеми столбцами

select *, count(choice) as votes from answers where question_id = 21 group by lower(choice) order by votes desc;

Поскольку я не указываю каждый столбец из SELECT в моем GROUP BY, это выдает ошибку, говорящую мне сделать это.

3. Указание всех столбцов в GROUP BY

select *, count(choice) as votes from answers where question_id = 21 group by lower(choice), id, user_id, question_id, choice order by votes desc;

Это просто выводит таблицу со столбцом votes как 1 для всех записей.

Как я могу получить количество vote и уникальные репрезентативные записи из 1. , но с всеми столбцами из возвращенной таблицы?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Вот что я закончил:

SELECT answers.*, cc.votes as votes FROM answers join (
    select max(id) as id, count(id) as votes 
    from answers
    group by trim(lower(choice))
) cc 
on answers.id = cc.id ORDER BY votes desc, lower(response) asc
0 голосов
/ 16 ноября 2011

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

похож на это:

WITH top5 AS (
  select question_id, lower(choice) as choice, count(*) as votes 
  from answers 
  where question_id = 21 
  group by question_id , lower(choice) 
  order by count(*) desc
  limit 5
)
SELECT DISTINCT ON(question_id,choice) *
FROM top5 
JOIN answers USING(question_id,lower(choice))
ORDER BY question_id, lower(choice), answers.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...