Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 в Gamma больше всего  [new]
dermama
Member

Откуда:
Сообщений: 96
Всем добрый денек!

Есть задача вывести имя компании, у которой наибольшее число сотрудников.
Я считерил, так как данных мало и нашел таки эту компанию с 4мя сотрудниками, а вот если данных миллион, то как мне искать, у меня нет больше мыслей. дайте направление в нужную сторону. Малости не хватает.

SELECT c.company_name
FROM company c
INNER JOIN
employee e
ON c.cid = e.cid
GROUP BY company_name
HAVING COUNT(enployee_name) > 3

запрос выводит верный результат
gamma
11 янв 19, 14:39    [21782880]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
iap
Member

Откуда: Москва
Сообщений: 46535
SELECT TOP(1) WITH TIES c.company_name
FROM company c JOIN employee e ON c.cid = e.cid
GROUP BY c.company_name
ORDER BY COUNT(*) DESC;
11 янв 19, 14:53    [21782900]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
dermama
Member

Откуда:
Сообщений: 96
iap,

Спасибо, а можно объяснить принцип работы данного запроса?
11 янв 19, 15:16    [21782934]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
uaggster
Member

Откуда:
Сообщений: 518
dermama
iap,

Спасибо, а можно объяснить принцип работы данного запроса?

Ничего особо сложного.
Связываем таблицу "компании" с таблицей "сотрудники". Получаем промежуточный резалтсет "компания-сотрудники"
Группируем полученный промежуточный резалтсет по имени компании - получаем список компаний (уникальные названия).
Сортируем полученный сгруппированный резалтсет по количеству строк с одинаковым названием компании по убыванию.
Извлекаем из отсортированной выборки 1 строку "с кандидатами", т.к. может оказаться более 1 компании с наибольшим числом сотрудников.
Будет работать, если среди компаний нет полных тёзок.
Если полные тёзки есть - может иногда работать неверно.

Я бы, например, так лаконично не написал. Я бы во внутреннем подзапросе посчитал выборку: компания - количество сотрудников, а во внешнем - отобрал бы top(1) with ties. Инерция мышления, разница в классе и всё такое. Снимаю шляпу.
:-)
11 янв 19, 16:17    [21783013]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
dermama
Member

Откуда:
Сообщений: 96
uaggster,

3 SELECT TOP(1) WITH TIES c.company_name
1 FROM company c JOIN employee e ON c.cid = e.cid
2 GROUP BY c.company_name
4 ORDER BY COUNT(*) DESC;

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


кстати, если не сложно, напиши свой вариант запроса по данному заданию пожалуйста.
11 янв 19, 16:26    [21783024]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
invm
Member

Откуда: Москва
Сообщений: 8300
dermama
я поставил номера в каком порядке он выполняется, верно?
Как выполняется запрос смотрят в его плане выполнения.
11 янв 19, 16:37    [21783045]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
uaggster
Member

Откуда:
Сообщений: 518
dermama
uaggster,

2 SELECT TOP(1) WITH TIES c.company_name
1 FROM company c JOIN employee e ON c.cid = e.cid
2 GROUP BY c.company_name
3 ORDER BY COUNT(*) DESC;

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


кстати, если не сложно, напиши свой вариант запроса по данному заданию пожалуйста.

Нет, неверно.

invm, да он про логическую последовательность, а не про физическую.
:-)

dermama
Логический порядок обработки инструкции SELECT:
FROM
ON
JOIN
where
GROUP BY
WITH CUBE или WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
т.е. ты - должен думать так. Как думает sqlserver, как сказал invm - можно посмотреть в плане.
Иногда (эээ... всегда :-) ) sqlserver думает не так, как предписывает логический порядок выполнения запроса.
Но результат всегда такой, как если бы логический порядок выполнения неукоснительно соблюдался.
... но есть нюансы. :-)
11 янв 19, 16:52    [21783060]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
uaggster
Member

Откуда:
Сообщений: 518
Пардон, наверху 4, конечно же.
11 янв 19, 16:53    [21783061]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
dermama
Member

Откуда:
Сообщений: 96
uaggster,

Спасибо, познавательно, про ордер я поставил на четвертое место, подумав что он заселектит и отсортирует потом) читаю сейчас книжку сборник рецептв SQL Энтони молинаро, там затронут был момент логической последовательности, но не вся. Так просто понимание приходит получше, однако пока над принципом работы запроса по выборке компании с наибольшим числом сторудников все еще думаю... (например вода кипит при 100 градусах - на уровне инстинкта , автоматика), чего не скажешь про это запрос.
11 янв 19, 17:01    [21783076]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 818
dermama
например вода кипит при 100 градусах - на уровне инстинкта , автоматика

Вид homo sapiens еще не научился определять температуру на уровне инстинктов.
Так что поведай нам, с какой ты планеты, родной?
11 янв 19, 17:23    [21783109]     Ответить | Цитировать Сообщить модератору
 Re: в Gamma больше всего  [new]
iap
Member

Откуда: Москва
Сообщений: 46535
dermama
uaggster,

Спасибо, познавательно, про ордер я поставил на четвертое место, подумав что он заселектит и отсортирует потом) читаю сейчас книжку сборник рецептв SQL Энтони молинаро, там затронут был момент логической последовательности, но не вся. Так просто понимание приходит получше, однако пока над принципом работы запроса по выборке компании с наибольшим числом сторудников все еще думаю... (например вода кипит при 100 градусах - на уровне инстинкта , автоматика), чего не скажешь про это запрос.
Логический порядок обработки инструкции SELECT
11 янв 19, 18:08    [21783173]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить