Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор только максимального значения из результатов.  [new]
SQLLQS
Guest
Вопрос скорее не по Microsoft SQL Server, а просто SQL. Спрашивал в ветке Oracle, но там никто не откликнулся.

SELECT MOFFER.DELIVERYPURCHASE, MOFFER.OFFERSTART, MOFFER.OFFEREND, MOFFER.RANKING
FROM EMTMOFFER MOFFER
INNER JOIN MMTDEMANDBID
ON MOFFER.OFFERID             = MMTDEMANDBID.MMTDEMANDBIDPK
WHERE MOFFER.DELIVERYPURCHASE = 'P'
AND MOFFER.OFFERSTART         >= '2012-01-10T00:00:00'
AND MOFFER.OFFEREND           <= '2012-01-11T00:00:00'
AND MMTDEMANDBID.BALANCEGROUPPK = '10032'

AND MOFFER.RANKING           IN
  (SELECT MAX(EMTMOFFER.RANKING)
  FROM EMTMOFFER
  WHERE EMTMOFFER.OFFERSTART = MOFFER.OFFERSTART
  AND EMTMOFFER.OFFEREND     = MOFFER.OFFEREND
  )

DELIVERYPURCHASE OFFERSTART          OFFEREND            RANKING                
---------------- ------------------- ------------------- ----------------------
P 2012-01-10T00:00:00 2012-01-10T01:00:00 1
P 2012-01-10T01:00:00 2012-01-10T02:00:00 1
P 2012-01-10T02:00:00 2012-01-10T03:00:00 1
P 2012-01-10T03:00:00 2012-01-10T04:00:00 1
P 2012-01-10T04:00:00 2012-01-10T05:00:00 1
P 2012-01-10T05:00:00 2012-01-10T06:00:00 1
P 2012-01-10T06:00:00 2012-01-10T07:00:00 1
P 2012-01-10T07:00:00 2012-01-10T08:00:00 1
P 2012-01-10T08:00:00 2012-01-10T09:00:00 1
P 2012-01-10T09:00:00 2012-01-10T10:00:00 1
P 2012-01-10T10:00:00 2012-01-10T11:00:00 1
P 2012-01-10T11:00:00 2012-01-10T12:00:00 1
P 2012-01-10T12:00:00 2012-01-10T13:00:00 1
P 2012-01-10T13:00:00 2012-01-10T14:00:00 1
P 2012-01-10T14:00:00 2012-01-10T15:00:00 1
P 2012-01-10T15:00:00 2012-01-10T16:00:00 1
P 2012-01-10T16:00:00 2012-01-10T17:00:00 1
P 2012-01-10T17:00:00 2012-01-10T18:00:00 1
P 2012-01-10T18:00:00 2012-01-10T19:00:00 1
P 2012-01-10T19:00:00 2012-01-10T20:00:00 1
P 2012-01-10T20:00:00 2012-01-10T21:00:00 1
P 2012-01-10T21:00:00 2012-01-10T22:00:00 1
P 2012-01-10T22:00:00 2012-01-10T23:00:00 1
23 rows selected

А если заменить SELECT MAX на SELECT MIN, то:
DELIVERYPURCHASE OFFERSTART          OFFEREND            RANKING                
---------------- ------------------- ------------------- ----------------------
P 2012-01-10T00:00:00 2012-01-10T01:00:00 1
P 2012-01-10T01:00:00 2012-01-10T02:00:00 1
P 2012-01-10T02:00:00 2012-01-10T03:00:00 1
P 2012-01-10T03:00:00 2012-01-10T04:00:00 1
P 2012-01-10T04:00:00 2012-01-10T05:00:00 1
P 2012-01-10T05:00:00 2012-01-10T06:00:00 1
P 2012-01-10T06:00:00 2012-01-10T07:00:00 1
P 2012-01-10T07:00:00 2012-01-10T08:00:00 1
P 2012-01-10T08:00:00 2012-01-10T09:00:00 1
P 2012-01-10T09:00:00 2012-01-10T10:00:00 1
P 2012-01-10T10:00:00 2012-01-10T11:00:00 1
P 2012-01-10T11:00:00 2012-01-10T12:00:00 1
P 2012-01-10T12:00:00 2012-01-10T13:00:00 1
P 2012-01-10T13:00:00 2012-01-10T14:00:00 1
P 2012-01-10T14:00:00 2012-01-10T15:00:00 1
P 2012-01-10T15:00:00 2012-01-10T16:00:00 1
P 2012-01-10T16:00:00 2012-01-10T17:00:00 1
P 2012-01-10T17:00:00 2012-01-10T18:00:00 1
P 2012-01-10T18:00:00 2012-01-10T19:00:00 1
P 2012-01-10T19:00:00 2012-01-10T20:00:00 1
P 2012-01-10T20:00:00 2012-01-10T21:00:00 1
P 2012-01-10T21:00:00 2012-01-10T22:00:00 1
P 2012-01-10T22:00:00 2012-01-10T23:00:00 1
P 2012-01-10T23:00:00 2012-01-11T00:00:00 1
24 rows selected

Разве результатом не должно быть одинаковое количество строк?
7 фев 12, 09:03    [12044743]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SQLLQS,

может быть несколько минимумов, равных друг другу.
И с максимумами такая же ситуация.
Но равных друг другу минимумов и равных друг другу максимумов может быть разное количество.
7 фев 12, 09:42    [12044890]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
SQLLQS
Guest
iap,
Тот же запрос, но без MAX/MIN совсем.
SELECT MOFFER.DELIVERYPURCHASE, MOFFER.OFFERSTART, MOFFER.OFFEREND, MOFFER.RANKING
FROM EMTMOFFER MOFFER
INNER JOIN MMTDEMANDBID
ON MOFFER.OFFERID             = MMTDEMANDBID.MMTDEMANDBIDPK
WHERE MOFFER.DELIVERYPURCHASE = 'P'
AND MOFFER.OFFERSTART         >= '2012-01-10T00:00:00'
AND MOFFER.OFFEREND           <= '2012-01-11T00:00:00'
AND MMTDEMANDBID.BALANCEGROUPPK = '10032'

DELIVERYPURCHASE OFFERSTART          OFFEREND            RANKING                
---------------- ------------------- ------------------- ----------------------
P 2012-01-10T00:00:00 2012-01-10T01:00:00 1
P 2012-01-10T01:00:00 2012-01-10T02:00:00 1
P 2012-01-10T02:00:00 2012-01-10T03:00:00 1
P 2012-01-10T03:00:00 2012-01-10T04:00:00 1
P 2012-01-10T04:00:00 2012-01-10T05:00:00 1
P 2012-01-10T05:00:00 2012-01-10T06:00:00 1
P 2012-01-10T06:00:00 2012-01-10T07:00:00 1
P 2012-01-10T07:00:00 2012-01-10T08:00:00 1
P 2012-01-10T08:00:00 2012-01-10T09:00:00 1
P 2012-01-10T09:00:00 2012-01-10T10:00:00 1
P 2012-01-10T10:00:00 2012-01-10T11:00:00 1
P 2012-01-10T11:00:00 2012-01-10T12:00:00 1
P 2012-01-10T12:00:00 2012-01-10T13:00:00 1
P 2012-01-10T13:00:00 2012-01-10T14:00:00 1
P 2012-01-10T14:00:00 2012-01-10T15:00:00 1
P 2012-01-10T15:00:00 2012-01-10T16:00:00 1
P 2012-01-10T16:00:00 2012-01-10T17:00:00 1
P 2012-01-10T17:00:00 2012-01-10T18:00:00 1
P 2012-01-10T18:00:00 2012-01-10T19:00:00 1
P 2012-01-10T19:00:00 2012-01-10T20:00:00 1
P 2012-01-10T20:00:00 2012-01-10T21:00:00 1
P 2012-01-10T21:00:00 2012-01-10T22:00:00 1
P 2012-01-10T22:00:00 2012-01-10T23:00:00 1
P 2012-01-10T23:00:00 2012-01-11T00:00:00 1
24 rows selected
И те же 24 результата. Т.е. нету равных максимумов и минимумов в одинаковый часовой промежуток.
7 фев 12, 09:58    [12044950]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SQLLQS,

таблица EMTMOFFER в подзапросе ограничена совсем не так, как в основном запросе.
В общем случае там намного больше записей.
Поэтому странно что-либо оценивать, глядя на результат запроса без IN().
7 фев 12, 10:12    [12045007]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
SQLLQS
Guest
iap,

В таблице не может быть записей с одинаковым Ranking при одинаковом времени. Если время совпадёт при добавлении записи, то Ranking увеличится. Вот и нужно максимальные Ranking получить по всем часовым диапазонам.
7 фев 12, 10:32    [12045152]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SQLLQS,

например, если есть записи в EMTMOFFER

OFFERSTARTOFFERENDDELIVERYPURCHASERANKING
2012-01-10T15:00:002012-01-10T30:00:00 A2
2012-01-10T31:00:002012-01-10T45:00:00 B1

то минимальное значение 1, оно возвращается и основным запросом.
Но максимум равен 2, а мы всё равно требуем совпадения в основном запросе,
несмотря на то, что DELIVERYPURCHASE-то разное!
7 фев 12, 10:43    [12045234]     Ответить | Цитировать Сообщить модератору
 Re: Выбор только максимального значения из результатов.  [new]
SQLLQS
Guest
iap,

т.е. надо еще AND EMTMOFFER.DELIVERYPURCHASE = MOFFER.DELIVERYPURCHASE добавить в IN()? Или как выйти из этой ситуации.
7 фев 12, 10:59    [12045331]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить