Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите построить запрос по DISTINCT / 18 сообщений из 18, страница 1 из 1
11.02.2015, 01:24
    #38876473
AlexYanky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Недавно начал работать с базами данных, в данном случае 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
11.02.2015, 01:54
    #38876487
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
GROUP BY и реши в какую агрегатную функцию обернуть четвёртое поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2015, 10:00
    #38876607
rstrelba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
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
11.02.2015, 10:10
    #38876617
stelvic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
AlexYanky,

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

Из базы 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
11.02.2015, 22:18
    #38877449
rstrelba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
AlexYanky,

я бы отсекал эти записи триггером на этапе вливки данных.
...
Рейтинг: 0 / 0
11.02.2015, 22:19
    #38877451
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
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
11.02.2015, 22:22
    #38877453
AlexYanky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Шавлюк Евгений,

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

К сожалению на этапе вливки данных я ничего не могу делать, есть определенные ограничения...
...
Рейтинг: 0 / 0
11.02.2015, 22:35
    #38877463
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
AlexYankyПро результаты сообщу...
Думаешь, они кого-то интересуют?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.02.2015, 22:38
    #38877465
AlexYanky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Спасибо и за Ваш ответ Dimitry Sibiryakov
...
Рейтинг: 0 / 0
11.02.2015, 22:57
    #38877469
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
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
12.02.2015, 00:21
    #38877503
AlexYanky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Шавлюк Евгений,

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

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

В результате повторы убрало, в том числе и те где разница по времени в 1 секунду, но.....
Но кроме того убрало из вывода и достаточно много полезных данных, которые повторами не являются...
...
Рейтинг: 0 / 0
12.02.2015, 10:36
    #38877695
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
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
12.02.2015, 15:15
    #38878170
rstrelba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Шавлюк Евгений,
ты что не понимаешь что свои запросом ты оставляешь только самый ранний из диапазона по времени звонок Васи к Пете с совпадающей продолжительностью?
...
Рейтинг: 0 / 0
12.02.2015, 15:49
    #38878234
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
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
12.02.2015, 16:20
    #38878287
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Шавлюк Евгений,

Ну а время перевести в 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
12.02.2015, 16:21
    #38878288
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите построить запрос по DISTINCT
Хочу еще показать ТС что длительность звонков тоже может отличаться на 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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите построить запрос по DISTINCT / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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