Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.041 c
1-1165501246
i-am-vladko
2006-12-07 17:20
2007.02.11
"сгладить" Resize


2-1169558509
vitv
2007-01-23 16:21
2007.02.11
Возможен ли следующий запрос?


15-1169200526
Prohodil Mimo
2007-01-19 12:55
2007.02.11
почему мигают лампочки на кулере?


15-1169092383
Тензор
2007-01-18 06:53
2007.02.11
Что такое матрица инерции в ODE ?


15-1169150541
Cyrax
2007-01-18 23:02
2007.02.11
Общий принцип организации виртуальных методов и...