powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите построить запрос по DISTINCT
18 сообщений из 18, страница 1 из 1
Помогите построить запрос по DISTINCT
    #38876473
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недавно начал работать с базами данных, в данном случае IBase.
Необходимо из базы данных вывести информацию о исходящих NumberIOrig и входящих NumberOOrig номерах абонентов, а также дату-время звонка TimeB и время длительности разговора TimeConn в секундах.

Мне надо выбрать из таблицы DINAR базы 4 поля и вывести их в элемент управления, но отсечь повторы по 3 полям NumberIOrig, TimeB, TimeConn.

Рабочий запрос был такого вида:

SELECT DISTINCT NumberIOrig, NumberOOrig, TimeB, TimeConn FROM DINAR WHERE (TimeB BETWEEN ..... AND .......) ORDER BY TimeB ASC;

В таком виде DISTINCT отсекает повторы по всем 4 полям, а мне нужно только по 3, а получать значения всех 4 полей.
Помогите сформировать запрос по такому вопросу...
Очень буду признателен!
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38876487
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP BY и реши в какую агрегатную функцию обернуть четвёртое поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38876607
rstrelba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYanky,

Код: sql
1.
2.
3.
SELECT NumberIOrig, NumberOOrig, TimeB, TimeConn FROM DINAR WHERE (TimeB BETWEEN ..... AND .......) 
group by 1,2,3,4
ORDER BY TimeB ASC
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38876617
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYanky,

Что-то не очень понятно, что ты хочешь увидеть в четвертом поле. Ты бы привел пример заполнения таблицы и чего хочешь увидеть в результате.
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877440
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз опишу проблему.
Есть АТС под которую я написал програмку на С++, вытаскивающую нужную статистику по всем номерам, только входящим, только исходящим, по разным категориям абонентов и т.д., подсчитывая общую длительность соединений в секундах и т.д., найбольшую нагрузку...

Из базы IBase я вытаскиваю номера исходящего абонента NumberIOrig, входящего NumberOOrig, время и дату TimeB, длительность соединения TimeConn. Но в АТС есть два управляющих модуля, и они бывают делают двойные записи в базу об одном и томже звонке, т.е. записи в которых NumberIOrig, NumberOOrig, TimeB, TimeConn одинаковые.
Первоначально мой запрос в программе был такого типа:
SELECT DISTINCT NumberIOrig, NumberOOrig, TimeB, TimeConn FROM DINAR WHERE (TimeB BETWEEN ..... AND .......) ORDER BY TimeB ASC;

В таком виде DISTINCT отсекает повторы по всем 4 полям, и мне надо было получать значения всех 4 полей. Это меня устраивало. Но оказалось что эти два модуля управления АТС еще иногда вносят в базу две записи про один и тот же звонок, которые отличаются только значениями поля дата-время (в базе хранится в формате времени Unix) на одну секунду - я это показал в прикрепленном файле. Т.е. если я буду использовать предыдущий запрос, то эти записи будут дальше вылазить, а мне тоже надо их отсечь.
Вот я и прошу помощи! Можно ли отсечь эти ненужные записи средствами SQL, а не возится и решать эту проблему на С++.
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877449
rstrelba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYanky,

я бы отсекал эти записи триггером на этапе вливки данных.
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877451
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYanky,

Код: sql
1.
2.
3.
SELECT NumberIOrig, NumberOOrig, TimeConn, min(TimeB) FROM DINAR WHERE (TimeB BETWEEN ..... AND .......) 
GROUP BY 1, 2, 3
ORDER BY 4
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877453
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

Спасибо, буду пробовать предложенные варианты. Про результаты сообщу...
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877454
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rstrelba,

К сожалению на этапе вливки данных я ничего не могу делать, есть определенные ограничения...
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877463
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYankyПро результаты сообщу...
Думаешь, они кого-то интересуют?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877465
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо и за Ваш ответ Dimitry Sibiryakov
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877469
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYankyв АТС есть два управляющих модуля, и они бывают делают двойные записи в базу об одном и томже звонке, т.е. записи в которых NumberIOrig, NumberOOrig, TimeB, TimeConn одинаковые. <...>
оказалось что эти два модуля управления АТС еще иногда вносят в базу две записи про один и тот же звонок, которые отличаются только значениями поля дата-время (в базе хранится в формате времени Unix) на одну секундуЕсли можете создать на этой таблице индекс по полям NumberIOrig, NumberOOrig, TimeB, то что-то типа этого не прокатит ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
recreate table tb(
     id int primary key
    ,n_inc varchar(3), n_out varchar(3), dts_b timestamp, c_time smallint
    ,constraint unq_iob unique(n_inc, n_out, dts_b) using index  unq_iob
);
commit;

insert into tb(id, n_inc, n_out, dts_b, c_time) values( 1, '660', '490', '09.01.2015 21:02:28', 5);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 2, '660', '490', '09.01.2015 21:02:29', 5);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 3, '660', '490', '09.01.2015 21:02:30', 4);

insert into tb(id, n_inc, n_out, dts_b, c_time) values( 4, '660', '770', '09.01.2015 21:02:40', 4);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 5, '660', '770', '09.01.2015 21:02:41', 5);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 6, '660', '770', '09.01.2015 21:02:42', 5);

insert into tb(id, n_inc, n_out, dts_b, c_time) values( 7, '660', '490', '11.02.2015 11:02:28', 1);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 8, '660', '490', '11.02.2015 11:03:30', 1);
insert into tb(id, n_inc, n_out, dts_b, c_time) values( 9, '660', '770', '11.02.2015 11:04:40', 1);
insert into tb(id, n_inc, n_out, dts_b, c_time) values(10, '660', '770', '11.02.2015 11:05:42', 1);
commit;

select b1.*
from tb b1
where not exists(
    select * from tb b2
    where
    b1.n_inc=b2.n_inc
    and b1.n_out=b2.n_out
    and datediff(second from b1.dts_b to b2.dts_b) =1
);


IDN_INCN_OUTDTS_BC_TIME366049009.01.2015 21:02.30.0004666077009.01.2015 21:02.42.0005766049011.02.2015 11:02.28.0001866049011.02.2015 11:03.30.0001966077011.02.2015 11:04.40.00011066077011.02.2015 11:05.42.0001
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877503
AlexYanky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

Сделал как посоветовали:

SELECT NumberIOrig, NumberOOrig, TimeConn, min(TimeB) FROM DINAR WHERE (TimeB BETWEEN .... AND ...) GROUP BY NumberIOrig, NumberOOrig, TimeConn ORDER BY TimeB ASC

В результате повторы убрало, в том числе и те где разница по времени в 1 секунду, но.....
Но кроме того убрало из вывода и достаточно много полезных данных, которые повторами не являются...
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38877695
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexYankyНо кроме того убрало из вывода и достаточно много полезных данных, которые повторами не являются...
Тогда определись с критерием что является повтором.
Если отклонение в 1 секунду, то можно сделать округление времени через какую-либо UDF
В этом примере обрезаем секунды (не округляем):
Код: sql
1.
2.
3.
SELECT NumberIOrig, NumberOOrig, TimeConn, min(TimeB) FROM DINAR WHERE (TimeB BETWEEN ..... AND .......) 
GROUP BY 1, 2, 3, left(cast(TimeB as varchar(24)), 16)
ORDER BY 4
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38878170
rstrelba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,
ты что не понимаешь что свои запросом ты оставляешь только самый ранний из диапазона по времени звонок Васи к Пете с совпадающей продолжительностью?
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38878234
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstrelba,

Последним запросом я оставил все звонки с совпадающими Васей, Петей, Продолжительностью и Минутой_ начала_звонка (четвертое поле для группировки)
Код: sql
1.
GROUP BY 1, 2, 3, left(cast(TimeB as varchar(24)), 16)


Но здесь кроется 2 проблемы:
1) 2 различных звонка одинаковой длительности за 1 минуту обрежутся (первый звонок 16:30:05 и следующий 16:30:35, оба по 10 секунд), да покажется один
2) Дубликаты один из которых записался 16:30:00, а второй 16:29:59 будут показаны как 2 звонка

Я предложил ТС определить критерий одинаковости звонков
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38878287
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

Ну а время перевести в integer и по нему уже группировать?

Код: plsql
1.
2.
3.
select ..... ,
         extract(hour from atime)*3660+extract(minute from time)*60+extract(second from atime) as secs
from ....
...
Рейтинг: 0 / 0
Помогите построить запрос по DISTINCT
    #38878288
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу еще показать ТС что длительность звонков тоже может отличаться на 1 секунду.
На примере это следующие 2 звонка после выделенных.

Решение при помощи execute block. Сохраняем предыдущую строку, и проверяем на вхождение в предыдущий звонок по длительности.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
execute block returns (
NumberIOrig int,
NumberOOrig int,
TimeB timestamp,
TimeConn int)
as
declare variable NumberIOrig0 int;
declare variable NumberOOrig0 int;
declare variable TimeB0 timestamp;
declare variable TimeConn0 int;
begin
  for SELECT DISTINCT NumberIOrig, NumberOOrig, TimeB, TimeConn
      FROM DINAR --WHERE (TimeB BETWEEN ..... AND .......)
      ORDER BY 1,2,3,4
  into NumberIOrig, NumberOOrig, TimeB, TimeConn do
  begin
    if (NumberIOrig is distinct from NumberIOrig0 or
        NumberOOrig is distinct from NumberOOrig0 or
        TimeB0 is null or
        TimeB not between TimeB0 and dateadd(second, TimeConn0, TimeB0))
    then
      suspend;
    NumberIOrig0 = NumberIOrig;
    NumberOOrig0 = NumberOOrig;
    TimeConn0 = TimeConn;
    TimeB0 = TimeB;
  end
end
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите построить запрос по DISTINCT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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