[SQL] вопрос

vladi1

Есть табличка Table с именами, например
Саша
Ваня
Саша
Саша
Миша
Маша
Нужен SELECT, который бы возвращал наиболее повторяющееся имя и кол-во повторений т.е 'Саша' '3'
Первую строку вытаскивать нельзя(без row_num! 3 вложенных SELECT'a - тоже.

eduard615


select name, count(name) as c from table group by name order by c desc limit 1;

vladi1

А без limit можно? "(без row_num!)" - я это и хотел сказать...

freezer

select name, c from (select name, count(name) as c from table group by name) as T where c=max(c)

ava3443

LIMIT-а вроде нет в стандартах SQL.

eduard615

точно, нету, забыл. тогда через max как выше написано

vladi1

where c=max(c)
Уверен, что прокатит?

vladi1

В WHERE не катит MAX

evgen5555


SELECT TOP 1 blablabla
не катит?

vladi1

"...Первую строку вытаскивать нельзя..." Иначе говоря, запариваться на платформу топами, роунамами нельзя

evgen5555


select name, max(c) from (select name, count(name) as c from table group by name) as G
а так?

vladi1

без group by в конце не прокатит:
select name,
max(c)
from (
select name,
count(name) as c
from table
group by name)
group by name
В итоге будет то же самое - строки с именем и кол-вом повторений, а нужна 1 строка с 1 именем и числом повторений этого имени 'Саша' 3

ava3443

вьюшки, курсоры, хранимые процедуры, насколько я понимаю, тоже нельзя использовать?

vladi1

нет, нужен обычный SELECT

evgen5555

Почему нельзя три вложенных?

otvertka07

потому что 2-х достаточно

Dmitriy71

Ну тыж выше сам написал два вложенных.

eduard615

where c=max(c)
Уверен, что прокатит?
так не покатит, а where c=(select max ...) покатит

vladi1

Просто вчера ходил на собеседование - там был такой вопрос в тесте.
После того, как я написал 3 СЕЛЕКТАМИ - спросили - а как еще типа можно, row_num я вспомнил, но он ждал еще какой-то способ... Еще способ я не назвал, ну вот мне и интересно как можно без 3 селектов и без вытягивания 1 строки забадяжить селект....

vladi1

Согласен, но если ты имеешь ввиду
select name, c
from (select name, count(name) c
from Table
group by name)
where c = (select max(c)
from (select name, count(name) as c
from Table
group by name)
)
то это 3 СЕЛЕКТА

daru

Может имели ввиду Top Ten Problem ?

zya369

бля...
я родил монстра :

select t.name from t, (select name,count(name) as c from t group by name) as t1 group by t.name having count(t.name)/count(distinct t1.name)=max(t1.c);

вроде работает


=> select name,count(name) as c from t group by name order by c desc;
name | c
---------------+----
ddddddasdasdd | 13
ddddddd | 11
zz | 7
s | 5
e | 3
dsdddddd | 3
(6 rows)

=> select t.name from t, (select name,count(name) as c from t group by name) as t1 group by t.name having count(t.name)/count(distinct t1.name)=max(t1.c);
name
---------------
ddddddasdasdd
(1 row)

=>

IvladV71

теперь я знаю, кто мне запросы писать будет =)

Dmitriy71

Объясните, почему вот это не катит:
select name, max(с)
from(
select name, count(name) as c
from table
group by name
)

zya369

мб потому, что max(c) всегдаа возвращает одно значние, но этому значению не всегда соответствует одинаковое значения name.
(например в таблице 5 записей 'a' и 5 'e') - max(c) вернет 5, а что возвращать name?)
И вообще, если ты делаешь select на какую-нить агрегатную функцию, то остальные поля, которые ты выбираешь, должны участвовать в group by (по указанной выше причине)

rosali


select name, max(с)
from(
select name, count(name) as c
from table
group by name
)

Даже не в том дело, что максимум может несколько раз достигаться. Просто нет _вообще никаких_ причин, чтобы этот name имел отношение к этому max. Иначе какую семантику по вашему должны иметь запросы, скажем

select name, sum(с)
from(
...
)
или

select name, max(с min(c)
from(
...
)
?

vladi1

Красиво родил

Lorin

срубил один select одним having-clause, не факт, что экономичнее ... тем более count и max из разных подзапросов => ещё один проход

zya369

вопрос стоял про селекты, а не про производительность

Lorin

тада - маладетц!
Оставить комментарий
Имя или ник:
Комментарий: