Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.69.151] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Всем хай! Сразу к делу.
Есть таблица цветов, причем ненормализованная и пр. Максимально упрощенный вариант - всего 1 колонка. Очевидно, что дубликаты названия цветов присутствуют: Красный Желтый Синий Красный Зеленый Красный Желтый Синий .... Мне нужно посчитать частотность каждого цвета. Это я сделал: select name, count(name) as [Популярность цвета] from Color group by name order by name; Допустим получились такие ответы: Бордовый 6 Желтый 2 Зеленый 9 Красный 9 Синий 8 Фиолетовый 6 ============== И теперь мне нужно оставить только цвета с максимальной частотностью, т е в ответе должны остаться Зеленый 9 Красный 9 Как написать такой запрос? |
Сообщ.
#2
,
|
|
|
SELECT TOP 1 WITH TIES a.name FROM ( select name, count(name) as [Популярность цвета] from Color group by name) as a ORDER BY a.[Популярность цвета] DESC |
Сообщ.
#3
,
|
|
|
Цитата MIF @ TOP 1 WITH TIES Без этих директив можно? или это единственный вариант? И зачем сортировать по популрности цвета, если она максимальная для всей выборки P.S. Может через подзапрос или having... |
Сообщ.
#4
,
|
|
|
MIF
А подзапрос-то зачем? SELECT TOP 1 WITH TIES [name], count([name]) as [Популярность цвета] FROM [Color] GROUP BY [name] ORDER BY 2 DESC Цитата FasterHarder @ Без этих директив можно? ЗАЧЕМ? |
Сообщ.
#5
,
|
|
|
1. Не думал, что 2000 sql его поддерживает, а оказывается with ties был уже в 7-ке!
2. Это задачка на фильтрацию групп, т е как бы намек на having Ну, with ties, так with ties! Лишь бы работало! |
Сообщ.
#6
,
Сообщение отклонено: Akina -
|
Сообщ.
#7
,
|
|
|
Еще возник уточняющий вопрос!
Допустим есть такие данные (все те же цвета): Алый 2 Бордовый 6 Голубой 5 Желтый 2 Зеленый 9 Красный 9 Синий 8 Сиреневый 7 Фиолетовый 6 И нужно отобрать группы цвета с указанием их частотности, которые не лучшие и не худшие, а "срединные", т е ответ будет таким: Бордовый 6 Голубой 5 Синий 8 Сиреневый 7 Фиолетовый 6 Как видно ушли цвета с Макс.частотностью = 9 и Мин.част. = 2 Это возможно через with ties, да? или нет... |
Сообщ.
#8
,
|
|
|
Цитата FasterHarder @ Это возможно через with ties, да? или нет... WITH TIES всего лишь добавляет равноценные записи в группу, если их часть отсекается ограничением количества. Цитата FasterHarder @ нужно отобрать группы цвета с указанием их частотности, которые не лучшие и не худшие, а "срединные" Вот в этом случае придётся делать как минимум подзапрос. А с учётом неопределённости лучше задачу отбора возложить на клиента. |
Сообщ.
#9
,
|
|
|
Цитата Akina @ Вот в этом случае придётся делать как минимум подзапрос. А с учётом неопределённости лучше задачу отбора возложить на клиента. Akina, так подскажи как написать запрос) ты ведь понимаешь, что, если я не сумел создать с простым with ties (даже не знал его раньше), то с отбором "срединных" тем более не получится. Тут даже непонятно, к чему должен стремиться подзапрос, т е я не понимаю до конца логику запроса -------------> нет шансов написать его на ms sql. Я только знаю, что having фильтрует группы, но от этого не легче... А срединные данные нужны в любых соревнованиях, когда, например: - победители, набравшие макс. балл переходят в след. тур - худшие выбывают - среди срединных проводят доп.соревнование Добавлено Есть такая мысль: отобрать лучших UNION худших в отдельную таблицу потом пытаться связывать результаты по неэквиваленции, либо через exists как-то... |
Сообщ.
#10
,
|
|
|
Цитата FasterHarder @ подскажи как написать запрос SELECT * FROM table WHERE field NOT IN ( 'SELECT для получения MAX' UNION ALL 'SELECT для получения MIN' ) Если это не то - формулируй задачу. Так, чтобы ни один самый въедливый зануда не знал, что спросить дополнительно. Цитата FasterHarder @ Я только знаю, что having фильтрует группы Это неправильно. Having выполняет фильтрацию после стадии группировки, в отличие от WHERE. Но необязательно для группы. Более того, группировки в запросе может вообще не быть (правда, не все СУБД такое позволят). |
Сообщ.
#11
,
|
|
|
Цитата Akina @ SELECT * FROM table WHERE field NOT IN ( 'SELECT для получения MAX' UNION ALL 'SELECT для получения MIN' ) Как я понял, опция with ties требует обязательно прописывать order by, а команда union all не допускает двух order by ----> возникает противоречие! Или я не прав?! Все остальное работает на 100%! |
Сообщ.
#12
,
|
|
|
Цитата FasterHarder @ команда union all не допускает двух order by сфига бы? допускает... и не просто два, а по одному на каждый подзапрос плюс ещё один на суммарный запрос. |
Сообщ.
#13
,
|
|
|
Цитата Akina @ сфига бы? допускает... и не просто два, а по одному на каждый подзапрос плюс ещё один на суммарный запрос. Akina, я вот тут открыл книжечку одну и тут есть такой абзац: "Можно также упорядочить результаты с помощью ORDER BY. Но при этом позволяется использовать только одну директиву ORDER BY, и она должна размещаться после завершающего оператора SELECT. Кроме того, в таком предложении ORDER BY можно использовать имена столбцов только из самого первого оператора SELECT". Я ни на грамм не ставлю под сомнения вашу квалификацию и не хочу спорить вообще, но ведь действительно, когда я записывал это в редакторе запросов, используя ДВА ORDER BY, в каждом запросе, то возникала ошибка с указанием на ORDER BY. Может дело в версиях используемого MS SQL Server? |
Сообщ.
#14
,
|
|
|
Цитата FasterHarder @ когда я записывал это в редакторе запросов, используя ДВА ORDER BY, в каждом запросе, то возникала ошибка с указанием на ORDER BY. Пример в студию. ORDER BY один для каждого SELECTа. Подзапрос это отдельный SELECT. |
Сообщ.
#15
,
|
|
|
FasterHarder
Ну вот тебе шаблон: ( select top X from ... order by ... ) union all ( select top Y from ... order by ... ) Вполне жизненная задачка, не так ли? и два ORDER BY... Цитата FasterHarder @ когда я записывал это в редакторе запросов, используя ДВА ORDER BY, в каждом запросе, то возникала ошибка с указанием на ORDER BY Редактор - это ещё не истина в последней инстанции. Поинтересуйся мнением сервера... |
Сообщ.
#16
,
|
|
|
Цитата Bas @ Пример в студию. Цитата Akina @ Вполне жизненная задачка, не так ли? и два ORDER BY... Прикладываю картинку - там 5 шагов. Приведены все запросы и возникающая ошибка при использовании union all. Напомню, что необходимо найти "срединные" записи, т е не лучшие и не худшие. Прикреплённый файлwith_ties.png (114,12 Кбайт, скачиваний: 442) |
Сообщ.
#17
,
|
|
|
На шаге 5 отдельные запросы обрами скобками...
|