Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1169404742
Garacio
2007-01-21 21:39
2007.02.11
рецепт создания БД


3-1163697525
Kolan
2006-11-16 20:18
2007.02.11
Как сделать чтобы программа подключалась к БД?


2-1169763713
frameZ
2007-01-26 01:21
2007.02.11
TreeView + BDE


15-1169340589
IMHO
2007-01-21 03:49
2007.02.11
Модель распространения ПО


6-1157547727
провидец
2006-09-06 17:02
2007.02.11
TWebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский