Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];
ВнизSQL-запрос на выборку нескольких наибольших/наименьших значений Найти похожие ветки
← →
Kostafey © (2007-01-18 19:20) [0]Подскажите пожалуйста. На сколько я помню в SQL есть функция(если я не ошибаюсь), которая позволяет выводить,
например 5 наибольших значений. Что-то в литературе копаюсь-ничего такого не нахожу. Max - возвращает
только 1 значение...
← →
Desdechado © (2007-01-18 19:23) [1]В разных СУБД разные подходы
SELECT TOP ... ORDER BY xxx DESC, например
← →
Павел Калугин © (2007-01-18 19:28) [2]> [0] Kostafey © (18.01.07 19:20)
СУБД какая?
в MSSQL есть волшебное слово TOP а в Sybase ASE - SETROWCOUNT (если верно помню. хелпа нет чтоб проверится под рукой)
← →
Kostafey © (2007-01-18 19:31) [3]> СУБД какая?
MS SQL Server 2005
> в MSSQL есть волшебное слово TOP
> В разных СУБД разные подходы
> SELECT TOP ... ORDER BY xxx DESC, например
Спасибо! Top - сработало !
Но по-моему есть для этого средства стандартного SQL ?
← →
Kostafey © (2007-01-18 19:37) [4]Вот еще что хотел спросить. Как-нибудь можно ли посылать запрос на выборку из датасета?
Т.е. у еас уже есть TADODataSet. В нем некий набор данных.
Теперь для этих данных необходимо сделать запрос на выборку.
Как это можно сделать ?
← →
Johnmen © (2007-01-18 19:55) [5]
> Но по-моему есть для этого средства стандартного SQL ?
Нет.
> Как это можно сделать ?
Никак.
← →
Kostafey © (2007-01-18 20:07) [6]> [5] Johnmen © (18.01.07 19:55)
Спасибо вы мне сэкономили кучу времени !
А как лучше поступить в случае вопроса > [4] Kostafey © (18.01.07 19:37)
Сделать курсор или таблицу-переменную, для которой уже делать выборку ?
Иначе написать такой запрос сразу будет уже сложновато...
← →
Anatoly Podgoretsky (2007-01-18 20:38) [7]> Kostafey (18.01.2007 19:31:03) [3]
Что такое стандартный SQL?
← →
Kostafey © (2007-01-18 20:43) [8]> [7] Anatoly Podgoretsky (18.01.07 20:38)
Гм. Дотошность в терминологии - вешь, несомненно, полезная но до оределенного предела.
Я имел в ввиду те операторы, функции SQL, которые применимы независимо от СУБД.
Как это правильнее выразиться ?
← →
Anatoly Podgoretsky (2007-01-18 20:45) [9]> Kostafey (18.01.2007 20:43:08) [8]
> Какой корыстный, а мы все для души! )
Вот и подумай, а до тех пор можешь дуться.
← →
Kostafey © (2007-01-18 20:51) [10]> [9] Anatoly Podgoretsky (18.01.07 20:45)
Все, уже не дуюсь :)
Хм, может для вопроса
> [6] Kostafey © (18.01.07 20:07)
отдельную ветку завести.
← →
ЮЮ © (2007-01-19 09:25) [11]
> Иначе написать такой запрос сразу будет уже сложновато..
> .
SELECT * FROM (
здесь запрос любой сложности
) a
ORDER BY ...
← →
StriderMan © (2007-01-19 09:52) [12]в FireBirde"е есть для этого конструкция
SELECT FIRST(n) * FROM ....
← →
Kostafey © (2007-01-19 10:27) [13]> [11] ЮЮ © (19.01.07 09:25)
Ух ты здорово ! Получилось. Спасибо!
Но вот что:
SELECT a.field1, a.field2...
FROM
(
--Дли-и-и-и-ннющий запрос
) a
WHERE
a.field1 in
(
select top(5) a.field1
from
(
--Дли-и-и-и-ннющий запрос повторяется
) a
)
Как-нибудь можно писать так:
SELECT a.field1, a.field2...
FROM
(
--Дли-и-и-и-ннющий запрос
) a
WHERE
a.field1 in
(select top(5) a.field1
from a)
Или второй вариант вообще невозможен ?
← →
evvcom © (2007-01-19 10:39) [14]А чем тебя просто
select top(5) a.field1
from a
order by
не устроил?
← →
Sergey13 © (2007-01-19 10:39) [15]> [13] Kostafey © (19.01.07 10:27)
А почему этот TOP 5 нельзя вклучить сразу или в "--Дли-и-и-и-ннющий запрос" или в головной? Что то мне твоя логика запроса странной кажется.
← →
Sergey13 © (2007-01-19 10:41) [16]> [13] Kostafey © (19.01.07 10:27)
Вообще все эти TOP-ы часто говорят о непродуманности в проектировании системы.
← →
Kostafey © (2007-01-19 11:09) [17]> А чем тебя просто
> select top(5) a.field1
> from a
> order by
> не устроил?
Тут вот в чем дело:
Я хочу чтобы первым было не поле, верхние значений которого нужны, а другое (текстовое поле).
Кроме того одно дело in Top(5), другое дело not in Top(5)
Буду говорить конкретнее. Идея в следующем:
select Descr "Параметр", fd1 as z1, fd2 as z2, 1 as Dummy
from Table_1
where fd1 in
(select top(5) fd1
from Table_1
order by fd1 DESC)
union
(
select "Прочее", sum(fd1) s1, sum(fd2) s2, 2 as Dummy
from Table_1
where fd1 not in
(select top(5) fd1
from Table_1
order by fd1 DESC)
)
order by Dummy, fd1 DESC
Это работающий запрос для простой таблицы. Я хочу чтобы на месте Table_1 стоял мой запрос (длиннннющий)
> А почему этот TOP 5 нельзя вклучить сразу или в "--Дли-и-
> и-и-ннющий запрос" или в головной? Что то мне твоя логика
> запроса странной кажется.
Этот запрос уже исползуется сам по себе. Я хочу исползовать его дополнительно как вложенный в запрос с Top.
> Вообще все эти TOP-ы часто говорят о непродуманности в проектировании
> системы.
Да нет же. Все просто. Я хочу построить диаграмму.
Для этого нужно взять первые, например 5 значений, а остальные сложить (обозвав например Прочие)
Взгляните на пример с Table_1.
← →
Sergey13 © (2007-01-19 11:12) [18]> Этот запрос уже исползуется сам по себе. Я хочу исползовать
> его дополнительно как вложенный в запрос с Top.
Тот, что используется сам по себе никак не связан с тем, где тебе надо TOP. Другими словами, если ты пишешь сочинение по "войне и миру", не обязательно в нем приводить полный авторский текст.
← →
Kostafey © (2007-01-19 11:23) [19]> Тот, что используется сам по себе никак не связан с тем,
> где тебе надо TOP. Другими словами, если ты пишешь сочинение
> по "войне и миру", не обязательно в нем приводить полный
> авторский текст.
То-то и оно, что связан. Набор данных, получаемый в результате выполнения "длннющщего" запроса никак по-другому не получить.
Вообще я уже реализовал это так:
1. Выполняется длиннющщий запрос (получаем НД в DataSet)
2. Создаю посредством SQL переменную типа Table и заполняю ее значениями полученного датасета
3. Для данной таблицы-переменной выполняю запрос на выборку 5-ти наибольших+ суммма остальных, не попавших в первую пятерку
4. По полученным данным строится хорошая диаграмма.
Все да хорошо, НО СЛИШКОМ ПРИТАЯНУТО ЗА УШИ !!!!
← →
Kostafey © (2007-01-19 11:21) [20]> Тот, что используется сам по себе никак не связан с тем,
> где тебе надо TOP. Другими словами, если ты пишешь сочинение
> по "войне и миру", не обязательно в нем приводить полный
> авторский текст.
То-то и оно, что связан. Набор данных, получаемый в результате выполнения "длннющщего" запроса никак по-другому не получить.
Вообще я уже реализовал это так:
1. Выполняется длиннющщий запрос (получаем НД в DataSet)
2. Создаю посредством SQL переменную типа Table и заполняю ее значениями полученного датасета
3. Для данной таблицы-переменной выполняю запрос на выборку 5-ти наибольших+ суммма остальных, не попавших в первую пятерку
4. По полученным данным строится хорошая диаграмма.
Все да хорошо, НО СЛИШКОМ ПРИТАЯНУТО ЗА УШИ !!!!
← →
Sergey13 © (2007-01-19 11:28) [21]> [19] Kostafey © (19.01.07 11:23)
Я балдею. Ты получил датасет, а потом просишь сервак еще раз дать 5 записей из него же? А почему просто по датасету (уже полученному!!!) не пробежаться?
← →
Kostafey © (2007-01-19 11:34) [22]> А почему просто по датасету (уже полученному!!!) не пробежаться?
Чтобы сервак не расслаблялся ! :)
Дело в том, что я просто сразу понял, что мне враз эту задачу не осилить.
Делал по частям. Поэтому такая ерундистика и получается.
А вот теперь собрать все воедино не выходит что-то.
(т.е. чтобы СУБД возвращала сразу данные для построения диаграммы)
Ну чтож как вариант придется на стороне клиента полученный датасет насиловать,
но мне уж очень хотелось найти красивое решение !
← →
Sergey13 © (2007-01-19 11:42) [23]> но мне уж очень хотелось найти красивое решение !
Ты его не нашел. Даже не тепло там, где ты ищешь.
← →
ЮЮ © (2007-01-19 11:48) [24]Насколько понял из > Kostafey © (19.01.07 11:09) [17], [20] хочется из сложного запроса 5 верхних записей дать как есть, а остальные проссумировать.
Причем сложный запрос выполнить только раз. Одним запросом, похоже, такого не сделать. Так что решение в [19] - единственное.
Только вместо 1 и 2, можно былобы сразу поместить результаты запроса непосредстаенно SQL-ем. Более того, т.к. на клиенте нужны всего 6 записей, то 1-3 можно выполнить на сервере (SP или UDF)
← →
ЮЮ © (2007-01-19 12:06) [25]Даже не заморачиваясь с ХП(UDF), можно все выполнить пакетом в "одном" запросе:
Declare @tmp TABLE(...)
INSERT INTO @tmp
SELECT <запрос>
select Descr "Параметр", fd1 as z1, fd2 as z2, 1 as Dummy
from @tmp
where fd1 in
(select top(5) fd1
from @tmp
order by fd1 DESC)
union
(
select "Прочее", sum(fd1) s1, sum(fd2) s2, 2 as Dummy
from @tmp
where fd1 not in
(select top(5) fd1
from @tmp
order by fd1 DESC)
)
order by Dummy, fd1 DESC
В результате в DataSet-е на клиенте будет не более 6 записей
← →
Kostafey © (2007-01-19 17:28) [26]> [23] Sergey13 © (19.01.07 11:42)
> Ты его не нашел. Даже не тепло там, где ты ищешь.
Охотно верю.
Возможно у вас есть более рациональное решение ?
Почему бы его не озвучить.
> [25] ЮЮ © (19.01.07 12:06)
Вы в очередной раз помогаете мне в вопросах SQL.
Большое СПАСИБО !
Все прекрасно работает.
Удивительно как я сам не догадался - решение то совсем не сложное.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.044 c