2010-06-15 2 views
1

Я несколько новичок в SQL-запросах, и я борюсь с этой конкретной проблемой. Допустим, я запрос, который возвращает следующие 3 записи (хранятся в одном столбце для простоты):
Том
Джек
ТомПолучить имена по коэффициенту их возникновения

И я хочу, чтобы эти результаты, сгруппированные по имени, а также включать в себя часть (отношение) появления этого имени из общей суммы возвращенных записей.

Итак, желаемый результат будет (в виде двух столбцов):
Tom | 2/3
Джек | 1/3

Как бы я это сделал? Определение числителя довольно просто (я могу просто использовать имена COUNT() и GROUP BY), но у меня возникли проблемы с переводом этого значения в соотношение из числа возвращенных строк.

Любая помощь очень ценится!

ответ

3
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name; 
+0

Ну, часть «имен» на самом деле является его собственным длинным запросом в моем случае. Должен ли я просто скопировать и вставить весь подзапрос, который появится в общем запросе дважды? Или есть способ сделать что-то вроде «SELECT name, COUNT (name)/(SELECT COUNT (1) FROM (SELECT ...) AS my_subquery) FROM my_subquery GROUP BY name;" ? Если есть, я не могу получить синтаксис правильно. –

+0

Кроме того, структура запроса, который вы предоставили, работает, но мне пришлось изменить «COUNT (1)» на «CAST (COUNT (1) AS float», поскольку в противном случае он выполнял целочисленное деление и возвращал все нули. –

1

Поскольку знаменатель зафиксирован, «отношение» прямо пропорционально числителю. Если вам действительно не нужно, чтобы показать знаменатель, это будет намного проще просто использовать что-то вроде:

select name, count(*) from your_table_name 
group by name 
order by count(*) desc 

и вы получите правильные данные в правильном порядке, но номер, который отображается будет вместо коэффициента.

Если вы действительно хотите этот знаменатель, вы бы сделали count(*) в негруппированной версии того же выбора - но в зависимости от того, сколько времени займет выбор, это может быть довольно медленным.

+0

Ну, причина, по которой я хочу, чтобы соотношение вместо чистых подсчетов было связано с тем, что я использую этот фильтр для своих данных. То есть, я хочу только вернуть «Том», если он составляет более половины возвращенных записей. В противном случае я рассматриваю его как просто шум. Есть ли более разумный способ обойти это? Возможно, я должен делать это в своем коде приложения? –

+0

@jjiffer: Может быть, приблизительный ответ был бы полезен? Только * одна * группа может составлять более половины записей, так что, возможно, вы могли бы просто вернуть запись с верхним счетом? Это не обязательно будет более половины записей, но, может быть, оно достаточно близко для ваших целей? –

+0

Это хороший момент, но у меня также есть возможность ничего не возвращать, если нет ответа «достаточно убедительно». Я, вероятно, немного поправлю немного и сравню время вычисления и точность использования более грубого приближения и посмотрим, какая техника выходит вперед. Спасибо за вашу помощь! –

Смежные вопросы