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

Откуда:
Сообщений: 10
Здравствуйте. Помогите пожалуйста.

есть таблица temp1 с полем str1

/hygiene/professionalnaya-chistka-zubov.html
/hygiene/professionalnaya-chistka-zubov.html
/reviews.html
/hygiene/professionalnaya-chistka-zubov.html
/reviews.html
/hygiene/snyatie-zubnogo-kamnya.html
/
/hygiene/professionalnaya-chistka-zubov.html
/reviews.html
/hygiene/snyatie-zubnogo-kamnya.html

При выполнении вот такого запроса
SELECT TOP 100 PERCENT str1, COUNT(*) AS ps
FROM dbo.temp1
GROUP BY str1
ORDER BY COUNT(*)

Получается результат
str1 ps
/ 1
/hygiene/professionalnaya-chistka-zubov.html 4
/hygiene/snyatie-zubnogo-kamnya.html 2
/reviews.html 3

т.е сортировка по столбцу с count(*) не производится

Вопрос: как извлечь из таблицы temp1 значение самого частовстречаемого поля, то есть хотелось бы в данном случае увидеть /hygiene/professionalnaya-chistka-zubov.html 4
16 ноя 15, 02:14    [18421679]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Добрый Э - Эх
Guest
Алексей_030212,
--
-- Набор тестовых данных:
with
  b$m_test (str1) as
    (
      select '/hygiene/professionalnaya-chistka-zubov.html' union all
      select '/hygiene/professionalnaya-chistka-zubov.html' union all
      select '/reviews.html' union all
      select '/hygiene/professionalnaya-chistka-zubov.html' union all
      select '/reviews.html' union all
      select '/hygiene/snyatie-zubnogo-kamnya.html' union all
      select '/' union all
      select '/hygiene/professionalnaya-chistka-zubov.html' union all
      select '/reviews.html' union all
      select '/hygiene/snyatie-zubnogo-kamnya.html'
    )
--
-- Основной запрос:
select top 1 with ties str1, COUNT(1)
  from b$m_test
 group by str1
 order by COUNT(1) desc 

Если самых частовстречаемых значений будет более одного, какое из них возвращать?
with ties вернет все такие строки, если что. Если же всё же нужна одна случайная, то убери with ties.
16 ноя 15, 05:29    [18421732]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Алексей_030212
сортировка по столбцу с count(*) не производится

Правильно. Сортируется готовый набор. А ты хочешь при сортировке ещё что-то вычислять...
Если нужна такая сортировка - следует указывать не выражение сортировки, а номер поля в выходном наборе (в данном случае - 2):
SELECT TOP 100 PERCENT str1, COUNT(*) AS ps
FROM dbo.temp1
GROUP BY str1
ORDER BY 2

Кстати, TOP 100 PERCENT - предикат совершенно бессмысленный. Но добавляющий серверу работы. Зачем?
Если же нужно не получить все записи, а только самую частую - то, как правильно сказал предыдущий оратор, следует использовать TOP 1 WITH TIES (будут выведены все записи с количеством равным максимальному), либо просто TOP 1 (будет выведена либо одна из них, случайная, если их более одной, либо единственная). Если же из нескольких нужна одна, но не случайная, а какая-то определённая - следует добавить ещё один уровень сортировки.
16 ноя 15, 09:11    [18421942]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей_030212
т.е сортировка по столбцу с count(*) не производится

Все прекрасно сортируется
16 ноя 15, 09:34    [18422021]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Akina
Правильно. Сортируется готовый набор. А ты хочешь при сортировке ещё что-то вычислять...
Если нужна такая сортировка - следует указывать не выражение сортировки, а номер поля в выходном наборе (в данном случае - 2)
Откуда дровишки?
И как тогда отсортировалось у "предыдущего оратора"?
16 ноя 15, 09:55    [18422097]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
invm
Откуда дровишки?

Как полагаешь, можно сортировать по вычисляемому выражению, не вычисляя этого выражения?

invm
как тогда отсортировалось у "предыдущего оратора"?

Нормально отсортировалось. Мне интереснее, почему НЕ отсортировалось у ТС.

PS. Это и в MS SQL, и в MS Access присутствует - двойное написание многоэтажного безобразия, когда нужно по вычисляемому полю сортирить. Верю, что сейчас сервер стал умнее (хотя до сих пор не знаю, как именно сервер устанавливает, что не требуется второе вычисление) - но прекрасно помню давний казус, когда сервер отказался выполнять запрос с таким дублированием, причём причиной этой странности оказался всего лишь регистр одного символа в имени поля.
16 ноя 15, 10:46    [18422355]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Akina
Как полагаешь, можно сортировать по вычисляемому выражению, не вычисляя этого выражения?

А почему агрегатная функция не вычисляется то в ORDER BY ?
16 ноя 15, 10:52    [18422383]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Glory
почему агрегатная функция не вычисляется то в ORDER BY ?

Физически она вычисляется на этапе вычисления выходных полей. Даже если не входит в перечень полей выходного набора. А на этапе группировки просто используется ранее вычисленное значение.

Да нормально всё. Неудачно сформулировал мысль в словах, вот и непонятки.
16 ноя 15, 11:05    [18422430]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
o-o
Guest
просто Akina -- MySQL-евец,
а у них в order by не катит count(*), пока его не заалиасишь.
и вот раз в SQL Server/Oracle/Teradata (да где угодно, кроме MySQL) можно и так:
select schema_id, COUNT(*) 
from sys.objects
group by schema_id
order by COUNT(*)

и сяк:
select schema_id, COUNT(*) as cnt
from sys.objects
group by schema_id
order by cnt

а в MySQL первое не катит,
то не объявлять же ущербным MySQL, лучше остальные СУБД обкакать
16 ноя 15, 11:09    [18422455]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка сгруппированных данных  [new]
Алексей_030212
Member

Откуда:
Сообщений: 10
Добрый Э - Эх,
преогромнейшее спасибо!
16 ноя 15, 17:01    [18425037]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить