powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как найти 3 максимальных значения?
8 сообщений из 8, страница 1 из 1
Как найти 3 максимальных значения?
    #32600183
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
Здравствуйте. Сервер IB 6.0. У меня есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE TRUNK_DATA (
    AUTO_INC     INTEGER NOT NULL,
    ID           SMALLINT,
    DATE_TIME    DATE,
    CONV_OCC_I   FLOAT,
    CONV_OCC_O   FLOAT);
Нужно за определенный промежуток времени (Date_time) найти 3 значения Date_time (3 дня), за которые сумма CONV_OCC_I и CONV_OCC_O будет максимальной. Максимальной - значит значение, соответствующее максимальному значению (CONV_OCC_I+CONV_OCC_O), затем чуть меньшему значению и еще чуть меньшему значению (т.е. если сумму отфильтровать в обратном порядке, то мне нужны значения даты, соответствующие первым 3 строкам). Надеюсь понятно объяснил, что мне нужно. Как это сделать?
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600215
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу "Сервер IB 6.0" тихо умолчим, но для FB выглядит так

SELECT FIRST 3 * FROM TRUNK_DATA
WHERE DATE_TIME BETWEEN :D1 AND :D2
ORDER BY CONV_OCC_I+CONV_OCC_O DESC

для IB > 6.0 можно использовать аналогичную конструкцию, либо вызывать из процедуры и после 3-й записи прекратить ее выполнение
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600349
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT TD.CONV_OCC_I+TD.CONV_OCC_O , TD.*
FROM TRUNK_DATA TD
ORDER BY  1  DESC

Первые 3 записи в НД - твои...
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600761
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
2 Шавлюк Евгений - твой пример к сожалению не работает. У меня БД в 1 диалекте (может с этим связано). Короче ругается на FIRST 3 в запросе, а также в запросе нельзя упорядочить по сумме CONV_OCC_I+CONV_OCC_O (можно отдельно по CONV_OCC_I и по CONV_OCC_O).
2 Johnmen - все работает. Сегодня сам вспомнил о таком решении ORDER BY 1.
Спасибо.
2 ALL - что мне даст переход с 1-го на 3-й диалект. И где можно почитать о различиях. А то меня смущает тот факт, что в IBExpert есть куча зарезервированных слов, а какое их назначение для меня неизвестно.
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600765
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Короче ругается на FIRST 3 в запросе
У тебя IB6.0, а не FB. Я не помню в IB6 есть rows или он появился в 7, но попробуй так:
Код: plaintext
1.
2.
3.
4.
select *
from ...
where ...
order by .. desc
rows  3 
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600782
GDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GDR
Гость
2 Zmeishe - rows у меня не работает.
Появился еще один вопрос. Воспользовался советом Johnmen и напмсал такое:
Код: plaintext
1.
2.
3.
4.
5.
SELECT trunk_data.CONV_OCC_I+trunk_data.CONV_OCC_O , trunk_data.date_time
FROM TRUNK_DATA
where trunk_data.id =  411  and
trunk_data.date_time between '2.06.2004' and '8.06.2004 23:00'
ORDER BY  1  DESC
Все нормально, кроме одного. Я забыл сказать, что мне нужно 3 значения Date_time c максимальным значением CONV_OCC_I+CONV_OCC_O за три разных ДНЯ. Я получил такие данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
F_1	DATE_TIME
 87 , 40 	 04 . 06 . 2004   21 : 00 
 84 , 06 	 04 . 06 . 2004   22 : 00 
 81 , 64 	 04 . 06 . 2004   20 : 00 
 78 , 57 	 04 . 06 . 2004   17 : 00 
 78 , 20 	 04 . 06 . 2004   18 : 00 
 78 , 20 	 04 . 06 . 2004   19 : 00 
 78 , 10 	 04 . 06 . 2004   16 : 00 
 77 , 35 	 03 . 06 . 2004   20 : 00 
 74 , 61 	 03 . 06 . 2004   19 : 00 
 74 , 60 	 03 . 06 . 2004   22 : 00 
 74 , 39 	 03 . 06 . 2004   21 : 00 
 74 , 12 	 08 . 06 . 2004   22 : 00 
Мне нужно получить:
F_1 DATE_TIME
87,40 04.06.2004 21:00 - макс. значение за 04
77,35 03.06.2004 20:00 - макс. значение за 03
74,12 08.06.2004 22:00 - макс. значение за 08
Т.е. мне нужны 3 значения типа Date_time с максимальным значением CONV_OCC_I+CONV_OCC_O. Извиняюсь, что поздно вспомнил, но надеюсь решение найдется.
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32600857
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это как-то поможет
Код: plaintext
1.
2.
select TRUNK_DATA.* from TRUNK_DATA
where (CONV_OCC_I+CONV_OCC_O) in 
  (select max(CONV_OCC_I+CONV_OCC_O) from TRUNK_DATA group by DATE_TIME order by DATE_TIME desc)
но будут проблемы со временем в поле "DATE_TIME". Нужно выделить только дату из этого поля.
------------------------
С уважением, Denis Uskov
...
Рейтинг: 0 / 0
Как найти 3 максимальных значения?
    #32601005
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>GDR

Решений м.б. несколько с вариациями.
Напр.
1. Добавить в табл. вычисляемое поле DT типа DATE.
CAST(EXTRACT(DAY FROM date_time)||'.'||
EXTRACT(MONTH FROM date_time)||'.'||
EXTRACT(YEAR FROM date_time) AS DATE)
Тогда

Код: plaintext
1.
2.
3.
4.
SELECT DT, MAX(CONV_OCC_I+CONV_OCC_O)
FROM TRUNK_DATA
GROUP BY DT
ORDER BY  2  DESC

2. Написать ХП, в которой реализовать желаемое.
3. ...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как найти 3 максимальных значения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]