Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-запрос, Помогите написать! 
:(
    Опции темы
kvadrokub
Дата 18.10.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Всем доброго времени суток. На экзамене по БД попался такой вопрос с написанием SQL-запроса:

Имеется таблица:
++++++++++++++++++++++++++++
|     id     | Номер команды | Результат |
++++++++++++++++++++++++++++
|     1      |           10            |     1000     |
|     2      |           12            |     1100     |
|     3      |           10            |      500      |
|     4      |           11            |      700      |
|    ...      |           ...             |        ...       |
++++++++++++++++++++++++++++
Найти номер команды, которая больше всего раз встречается в таблице.

Вот примерно так выглядит условие. Помогите, пожалуйста.

Это сообщение отредактировал(а) kvadrokub - 18.10.2010, 08:11
PM MAIL   Вверх
Akina
Дата 18.10.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

select top 1 num_c
from table
group by num_c
order by count(num_c) desc
Однако не определено, что делать, если команд с таким количеством несколько.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kvadrokub
Дата 18.10.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



top 1 - это, получается, одно самое большое значение?

Это сообщение отредактировал(а) kvadrokub - 18.10.2010, 08:32
PM MAIL   Вверх
Akina
Дата 18.10.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



При указанной сортировке - да. Есссно это диалектозависимо - например в MySQL это будет LIMIT 1.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kvadrokub
Дата 18.10.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Цитата(Akina @ 18.10.2010,  10:30)
При указанной сортировке - да. Есссно это диалектозависимо - например в MySQL это будет LIMIT 1.

Тогда немного конкретизирую задачу. Написать без top 1, а с помощью подзапросов. Также, чтобы не было диалектозависимо, а было на чистом SQL.
PM MAIL   Вверх
Данкинг
Дата 18.10.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Цитата(kvadrokub @  18.10.2010,  09:33 Найти цитируемый пост)
Также, чтобы не было диалектозависимо, а было на чистом SQL. 

Это как так, интересно? Тебе Akina пример запроса привёл, а далее говоришь преподу, что частный случай зависит от конкретной СУБД. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
kvadrokub
Дата 18.10.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Цитата(Данкинг @ 18.10.2010,  11:09)
Цитата(kvadrokub @  18.10.2010,  09:33 Найти цитируемый пост)
Также, чтобы не было диалектозависимо, а было на чистом SQL. 

Это как так, интересно? Тебе Akina пример запроса привёл, а далее говоришь преподу, что частный случай зависит от конкретной СУБД. smile

Нужно как раз-таки написать так, чтобы запрос работал на любой СУБД одинаково и не нужно было ничего менять, т.е. на голом ANSI SQL. Ну, например, только с использованием max и count.

Это сообщение отредактировал(а) kvadrokub - 18.10.2010, 09:17
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  09:14 Найти цитируемый пост)
 т.е. на голом ANSI SQL.

SQL92
Код

select command from table group by commmand having count(*)  = (select max(count(*)) from table group by command)

Вернет ВСЕ команды, повторяющиеся наиболшьшее количество раз.
может статься, что этот запрос вполне соответствует и SQL86

SQL2003
Код

select command from (select command, row_number over (order by count(*) desc) rn from table group by command) s where rn = 1 

Вернет любую одну команду, повторяющуюся наибольшее количество раз
Если нужно чтобы были выведены все команды, повторяющиеся наибольшее количество раз, row_number заменить на dence_rank

Добавлено @ 09:46
следует отметить что SQL2003 держут отнюдь не все движки. Ровно как и SQL92

Это сообщение отредактировал(а) Zloxa - 18.10.2010, 09:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 18.10.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

select q.num_c
from
(
  select t.num_c, count(t.num_c) as cnt_num_c
  from table as t
  group by t.num_c
) as q
group by q.num_c
having q.cnt_num_c=max(q.cnt_num_c)
Вернёт все записи, у которых количество равно максимальному.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kvadrokub
Дата 18.10.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Вау, супер!  smile  Пошёл пробовать. smile

А у меня первоначальный вариант был примерно такой:

SELECT TEAM
FROM TABLE,
          (SELECT TEAM, COUNT(TEAM) AS CNT
           FROM TABLE
           GROUP BY TEAM) A
WHERE TABLE.TEAM = A.TEAM AND (SELECT MAX(CNT) FROM A) = и вот тут ступор smile
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  18.10.2010,  10:01 Найти цитируемый пост)

group by q.num_c
having q.num_c=max(q.num_c)

предикат вернет истину для каждой строки.

Это сообщение отредактировал(а) Zloxa - 18.10.2010, 10:12


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Кстати говоря, никто из вас не умеет правильно писать запросы. smile Zloxa не дружит с GROUP BY совершенно, а у Akina просто неправильные запросы. ;) Не сдали бы вы экзамен в моём университете. smile

Это сообщение отредактировал(а) kvadrokub - 18.10.2010, 10:40
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  10:36 Найти цитируемый пост)
Кстати говоря, Zloxa, ты не умеешь правильно писать GROUP BY.

ты не мог бы намекнуть менее прозрачно?

Это сообщение отредактировал(а) Zloxa - 18.10.2010, 10:40


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kvadrokub
Дата 18.10.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.9.2010

Репутация: 1
Всего: 1



Цитата(Zloxa @ 18.10.2010,  12:39)
Цитата(kvadrokub @  18.10.2010,  10:36 Найти цитируемый пост)
Кстати говоря, Zloxa, ты не умеешь правильно писать GROUP BY.

ты не мог бы намекнуть менее прозрачно?

Я про этот запрос:
select command from table group by commmand having count(*)  = (select max(count(*)) from table group by command)
PM MAIL   Вверх
Zloxa
Дата 18.10.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(kvadrokub @  18.10.2010,  10:41 Найти цитируемый пост)
Я про этот запрос:

Иииииии?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.