[SQL] вопрос
select name, count(name) as c from table group by name order by c desc limit 1;
А без limit можно? "(без row_num!)" - я это и хотел сказать...
select name, c from (select name, count(name) as c from table group by name) as T where c=max(c)
LIMIT-а вроде нет в стандартах SQL.
точно, нету, забыл. тогда через max как выше написано
Уверен, что прокатит?
В WHERE не катит MAX
не катит?
SELECT TOP 1 blablabla
"...Первую строку вытаскивать нельзя..." Иначе говоря, запариваться на платформу топами, роунамами нельзя
а так?
select name, max(c) from (select name, count(name) as c from table group by name) as G
select name,
max(c)
from (
select name,
count(name) as c
from table
group by name)
group by name
В итоге будет то же самое - строки с именем и кол-вом повторений, а нужна 1 строка с 1 именем и числом повторений этого имени 'Саша' 3
вьюшки, курсоры, хранимые процедуры, насколько я понимаю, тоже нельзя использовать?
нет, нужен обычный SELECT
Почему нельзя три вложенных?
потому что 2-х достаточно
Ну тыж выше сам написал два вложенных.
where c=max(c)так не покатит, а where c=(select max ...) покатит
Уверен, что прокатит?
После того, как я написал 3 СЕЛЕКТАМИ - спросили - а как еще типа можно, row_num я вспомнил, но он ждал еще какой-то способ... Еще способ я не назвал, ну вот мне и интересно как можно без 3 селектов и без вытягивания 1 строки забадяжить селект....
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 СЕЛЕКТА
я родил монстра :
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)
=>
теперь я знаю, кто мне запросы писать будет =)
select name, max(с)
from(
select name, count(name) as c
from table
group by name
)
(например в таблице 5 записей 'a' и 5 'e') - max(c) вернет 5, а что возвращать name?)
И вообще, если ты делаешь select на какую-нить агрегатную функцию, то остальные поля, которые ты выбираешь, должны участвовать в group by (по указанной выше причине)
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(
...
)
Красиво родил
срубил один select одним having-clause, не факт, что экономичнее ... тем более count и max из разных подзапросов => ещё один проход
вопрос стоял про селекты, а не про производительность
Оставить комментарий
vladi1
Есть табличка Table с именами, напримерСаша
Ваня
Саша
Саша
Миша
Маша
Нужен SELECT, который бы возвращал наиболее повторяющееся имя и кол-во повторений т.е 'Саша' '3'
Первую строку вытаскивать нельзя(без row_num! 3 вложенных SELECT'a - тоже.