2015-06-18 2 views
0

Мне нужно выбрать только одну строку, которая имеет наибольший счет. Как мне это сделать?выберите только одну строку, которая имеет наибольший счет в sql

Это мой текущий код:

select firstname, lastname, count(*) as total 
from trans 
join work 
on trans.workid = work.workid 
join artist 
on work.artistid = artist.artistid 
where datesold is not null 
group by firstname, lastname; 

Пример тока:

FIRSTNAME | LASTNAME | TOTAL 
------------------------------ 
Tom  | Cruise | 3 
Angelina | Jolie | 9 
Britney | Spears | 5 
Ellie  | Goulding | 4 

мне это нужно, чтобы выбрать только это:

FIRSTNAME | LASTNAME | TOTAL 
-------------------------------- 
Angelina | Jolie  | 9 
+0

Какие СУБД вы используете (Oracle, SQL Server, MySQL, Postgresql, другие)? – potashin

+0

Я использую Oracle. –

ответ

0

В Oracle 12, вы можете сделать:

select firstname, lastname, count(*) as total 
from trans join 
     work 
     on trans.workid = work.workid join 
     artist 
     on work.artistid = artist.artistid 
where datesold is not null 
group by firstname, lastname 
order by count(*) desc 
fetch first 1 row only; 

В более старых версиях вы можете сделать это с помощью подзапроса:

select twa.* 
from (select firstname, lastname, count(*) as total 
     from trans join 
      work 
      on trans.workid = work.workid join 
      artist 
      on work.artistid = artist.artistid 
     where datesold is not null 
     group by firstname, lastname 
     order by count(*) desc 
    ) twa 
where rownum = 1; 
+0

спасибо! это сработало. –

1

Вы можете добавить order by total desc и fetch first 1 row only (поскольку Oracle 12c r1 только, othe по часовой стрелке, вы должны использовать свой результат как временную таблицу и select, чтобы использовать ограничение rownum = 1 в предложении where), если вы total не может быть одинаково для разных групп. Другой способ заключается в добавлении этого having пункта, так что вы можете получить список всех людей с максимальной total:

having count(*) = (select max(total) from (select count(*) as total from <your_query>) tmp) 

или что:

having count(*) = (select count(*) as total from <your_query> order by total desc fetch first 1 row only) 
0

это будет работать SQL Server 2012 ..

with CTECount (firstname, lastname,total) 
 
as 
 
(
 
\t select firstname, lastname, count(1) as total 
 
\t from trans 
 
\t join work 
 
\t on trans.workid = work.workid 
 
\t join artist 
 
\t on work.artistid = artist.artistid 
 
\t where datesold is not null 
 
\t group by firstname, lastname 
 
) 
 

 
select top(1) with ties from CTECount 
 
order by total desc

Благодаря

0

Вы могли бы сделать так, очень просто:

выберите TOP 1 Firstname, Lastname , count (*) как итог от trans присоединяйтесь к работе на trans.workid = work.workid Присоединиться к художнику на work.artistid = artist.artistid где dateold не является нулевым группа по имени, фамилиям Сортировка по Всего DESC;

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