Вопрос по счетчикам в запросах

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
gopher
Сообщения: 1
Зарегистрирован: 15 янв 2008, 11:12

Вопрос по счетчикам в запросах

Сообщение gopher » 15 янв 2008, 11:16

Задача такая: select запрос должен получить выборку, в которой отброшены 3 самых больших и три самых маленьких значения. Ясно, что делать надо как то при помощи first и skip. Как конкретно?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 янв 2008, 11:24

1. Версия сервера
2. Цена решения

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 янв 2008, 15:50

Как конкретно?
это что, задача на сообразительность?
никак. потому что сколько записей в выборке - неизвестно. допустим, skip пропустит нужное число, а 3 последних ты сам выкинь.

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Re: Вопрос по счетчикам в запросах

Сообщение Kotъ-Begemotъ » 15 янв 2008, 16:11

gopher писал(а):Задача такая: select запрос должен получить выборку, в которой отброшены 3 самых больших и три самых маленьких значения. Ясно, что делать надо как то при помощи first и skip. Как конкретно?
Как вариант промежуточным сохранением результата первого запроса в таблицу. Затем к этой таблице запрос со скипом, выбирающим записи с 4-й до конца, опять сохранение и снова запрос... Работать будет, хотя возможно есть и более правильные методы :)

dragon_art
Сообщения: 18
Зарегистрирован: 20 сен 2006, 09:18

Re: Вопрос по счетчикам в запросах

Сообщение dragon_art » 15 янв 2008, 16:29

gopher писал(а):Задача такая... Как конкретно?
Предлагаю такой вариант, но за скорость не отвечаю:

Код: Выделить всё

select *
from some_tbl s
where
(s.fld1 not in (select first 3 s2.fld1 from some_tbl s2 order buy s2.fld1 ASC)) and
(s.fld1 not in (select first 3 s2.fld1 from some_tbl s2 order buy s2.fld1 DESC)) 

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 янв 2008, 22:14

Вот подрядились решать. А задачка даже не сформулирована толком.
Что должно получиться на таком ряде:
1, 1, 2, 2, 3, 3, 3, 3
А на таком:
1, 1, 1, 1, 1, 1, 1
Или на таком:
1, 1

dragon_art
Сообщения: 18
Зарегистрирован: 20 сен 2006, 09:18

Сообщение dragon_art » 16 янв 2008, 06:37

согласно условиям задачи, в этих случаях будет пустая выборка :D

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Вопрос по счетчикам в запросах

Сообщение stix-s » 16 янв 2008, 07:25

Kotъ-Begemotъ писал(а):
Как вариант промежуточным сохранением результата первого запроса в таблицу. Затем к этой таблице запрос со скипом, выбирающим записи с 4-й до конца, опять сохранение и снова запрос... Работать будет, хотя возможно есть и более правильные методы :)
как-то все сложно ты придумал, ХП проще да и запросом одним это можно реализовать
а вообще задача мутная какая-то, похоже либо на задачку в универе, либо на вопрос на тестировании.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 янв 2008, 10:33

Раз уж такая тусовка... Вот ещё одна Ж для пинания:

Код: Выделить всё

select skip 3 *
  from (select skip 3 * from table1 order by <condition> desc) q
  order by <condition>

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 16 янв 2008, 13:59

WildSery писал(а):Раз уж такая тусовка... Вот ещё одна Ж для пинания:

Код: Выделить всё

select skip 3 *
  from (select skip 3 * from table1 order by <condition> desc) q
  order by <condition>
только еще сгрупировать по <condition>

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 янв 2008, 18:02

Attid писал(а):только еще сгрупировать по <condition>
А вот это не факт. Задача по-прежнему сформулирована через Ж.

Ответить