Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите / 16 сообщений из 16, страница 1 из 1
09.02.2016, 23:06
    #39167158
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Есть две таблицы в одной контакты
(table_contact поля id, rec_id, fam, nam, city, phone, post) на 110 тыс. Причём таблица не идеал и там полно пустоты типа шв и rec_id . а остальное как корова языком слизала.
В другой таблице договора
(table_rec поля id, num, org,date_start,date_finish) на 400 тыс. записей.
В контактах нужно поймать всех у кого несколько договоров и оставить только тех, у кого два и более действующих договора в определённом квартале.
Distinct’ом из table_contact выбираю дубли через запрос
select distinct
c.rec_id,
r.num,
r.org,
(c.fam) concat ’ ‘ concat(c.nam),
c.city,
c.phone,
c.post
from table_contact as c, table_rec as r
where
c.rec_id=r.id
and (c.fam) concat ’ ‘ concat(c.nam) in (select (c.fam) concat ’ ‘ concat(c.nam) from table_contact as c group by (c.fam) concat ’ ‘ concat(c.nam) having count (rec_id)>1) order by (c.fam) concat ’ ‘ concat(c.nam),
а дальше всё швах, как только я пытаюсь добавить условие на проверку действительности договоров в квартале, например, такое,
select distinct
c.rec_id,
r.num,
r.org,
(c.fam) concat ’ ‘ concat(c.nam),
c.city,
c.phone,
c.post
from table_contact as c, table_rec as r
where
c.rec_id=r.id
and r. date_start <='01.07.2015'
and r.date_finish is null or r.date_finish >=’01.07.2015’
and (c.fam) concat ’ ‘ concat(c.nam) in
(select (c.fam) concat ’ ‘ concat(c.nam) from table_contact as c group by (c.fam) concat ’ ‘ concat(c.nam) having count (rec_id)>1)
order by (c.fam) concat ’ ‘ concat(c.nam)
ЦУ (DB2 9.7) так долго мелет шестерёнки, что желание снять запрос побеждает над чувством долга и ответственностью
Пыталась сварганить что то с Union, типа
(select distinct
c.rec_id,
r.num,
r.org,
(c.fam) concat ’ ‘ concat(c.nam),
c.city,
c.phone,
c.post
from table_contact as c, table_rec as r
where
c.rec_id=r.id
and (c.fam) concat ’ ‘ concat(c.nam) in (select (c.fam) concat ’ ‘ concat(c.nam) from table_contact as c group by (c.fam) concat ’ ‘ concat(c.nam) having count (rec_id)>1) order by (c.fam) concat ’ ‘ concat(c.nam))
union
(select
c.rec_id,
r.num,
r.org,
(c.fam) concat ’ ‘ concat(c.nam),
c.city,
c.phone,
c.post
from table_contact as c, table_rec as r
where
c.rec_id=r.id
and r. date_start <='01.07.2015'
and r.date_finish is null or r.date_finish >=’01.07.2015’)
но процесс так же затянулся.
Мб кто подскажет, где застреваю, r.num in (select для дублей из table_contact) то же пробовала, но запуталась.
Что не так не понимаю, оба запроса по отдельности работают замечательно, а связать не могу.
...
Рейтинг: 0 / 0
10.02.2016, 11:02
    #39167357
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_S,

как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with table_contact (rec_id, fam) as (values
  (1, 'Иванов')
, (2, 'Петров')
)
, table_rec (id, num, date_start, date_finish) as (values
  (1, 101, date('2015-06-01'), date('2015-08-01'))
, (1, 102, date('2015-06-01'), date('2015-08-01'))
, (2, 201, date('2015-06-01'), date('2015-08-01'))
, (2, 202, date('2015-07-02'), date('2015-08-01'))
)
select c.*, g.num_cnt
from table_contact c
join (
select id, count(1) num_cnt
from table_rec
where 
date('2015-07-01') between date_start and coalesce(date_finish, date('9999-12-31'))
--date('2015-07-01') <= coalesce(date_finish, date('9999-12-31')) and date('2015-09-30') >= date_start 
group by id
having count(1)>1
) g on g.id=c.rec_id


Ваше условие больше подходит под определение "у кого два и более действующих договора на начало квартала", а не "у кого два и более действующих договора в определённом квартале".
Договор может начаться после начала квартала, как в примере. Нужно ли вам учитывать такие договоры?
...
Рейтинг: 0 / 0
10.02.2016, 12:47
    #39167497
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein, развейте сомнения.

Смущает число 109737 пар в (as values (1, 'Иванов'), (2, 'Петров'),..., (109737,'Томас') из table_contact
и ещё большее 309974 число в квадриге (as (values (1, 101, date('2015-06-01'), date('2015-08-01'))

если мои опасения напрасны, что ждать придётся до 2-го пришествия, то ура и я в бой


PS Да, похоже, по ночам лучше спиться, чем пишется. С условием промах получился, нужно было ставить.

and(r.date_finish is null or r.date_finish between '01.07.2015' and '30.09.2015')
/*r.date_finish Договора либо действующие от царя Хмэля до нв, либо они закрылись с 01.07.2015 по 30.09.2015 и по ним ещё причитается */
and r.date_start <='30.09.2015'
/* r.date_start <='30.09.2015' отсекает договора заключенные в 4 квартале, по которым мы ничего не должны были, так как они ещё не существовали*/

но Ваше мне нравиться больше
...
Рейтинг: 0 / 0
10.02.2016, 14:19
    #39167620
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_Sразвейте сомнения.

Смущает число 109737 пар в (as values (1, 'Иванов'), (2, 'Петров'),..., (109737,'Томас') из table_contact
и ещё большее 309974 число в квадриге (as (values (1, 101, date('2015-06-01'), date('2015-08-01'))
Я не знаю, что у вас там за оборудование, но по-моему на таких объемах этот запрос должен отработать довольно быстро, если, конечно, вы не запускаете его на телефоне. :)
...
Рейтинг: 0 / 0
10.02.2016, 16:47
    #39167799
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_S,

Навеяло:
Код: 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.
31.
--table_rec     (id, num,    org, date_start,date_finish)
WITH A1 (FLD) AS ( SELECT CAST(FLD AS DATE) FROM TABLE(VALUES('2015-01-01')) A0 (FLD)),
A2 (FLD) AS (
SELECT FLD  + 1 days FROM A1
UNION  ALL
SELECT FLD  + 1 days FROM A2),
A3 AS (SELECT YEAR(A2.FLD) Y_DT, QUARTER(A2.FLD) Q_DT, A2.FLD D_DT FROM A2, A1 
WHERE A2.FLD > A1.FLD AND A2.FLD < '2017-01-01' FETCH FIRST 730 ROWS ONLY),


TABLE_REC (id, num,    org,  date_start, date_finish) AS (
VALUES
(1,'№127/12','ORG1','2016-01-15','2016-02-28'),
(2,'№128/14','ORG2','2015-12-01','2016-03-02'),
(3,'№129/45','ORG2','2016-01-16','2016-05-04'),
(4,'№122/78','ORG2','2016-04-26','2016-08-30'),
(5,'№137/88','ORG3','2015-02-02','2016-12-31') ),

TABLE_REC_AGG AS (
SELECT DISTINCT t1.id, t1.num,    t1.org, t1.date_start , t1.date_finish, a3.y_dt, a3.q_dt
FROM  TABLE_REC T1
INNER JOIN A3 ON a3.d_dt between t1.date_start and t1.date_finish
),
T3 AS (
SELECT  ORG,  Y_DT, Q_DT, COUNT(*) CNT FROM TABLE_REC_AGG 
GROUP BY org, y_dt, q_dt HAVING COUNT(*) > 1
) 
SELECT T0.ID, T0.NUM, T0.ORG, T0.DATE_START, T0.DATE_FINISH, T3.Y_DT, T3.Q_DT 
       FROM T3 
       INNER JOIN TABLE_REC T0 ON T3.ORG=T0.ORG
	   ORDER BY 3, 6, 7, 4, 5, 2, 1;



- выводит только договора, которых больше чем один за любой квартал, согласно календаря (это таблички А*),
а потом уже и справочник с контактами можно "подцепить" :)
...
Рейтинг: 0 / 0
10.02.2016, 17:46
    #39167886
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,

А можно вместо as (value (1,101, date('2015-06-01'),date('2015-08-01')), (2, 102, date ('2015-07-01'), date(''))) как то использовать as (select по тем же полям застряла на export to ex.del of del select id, num, org_name, date_start, date_finish from table_rec для списка под value да и дату не знаю как выгрузить в del она экспортируется например как 1,"022","org_name",20110913,20150203 а это совсем ни то, что у Вас :(
...
Рейтинг: 0 / 0
10.02.2016, 18:37
    #39167968
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_S,

Я использовал with ... values, чтоб показать полностью рабочий запрос без доступа к таблицам, которых у меня нет.
Вам же надо использовать реальные ваши таблицы как-то так:

select c.*, g.num_cnt
from table_contact c
join (
select id, count(1) num_cnt
from table_rec
where
date('2015-07-01') between date_start and coalesce(date_finish, date('9999-12-31'))
--date('2015-07-01') <= coalesce(date_finish, date('9999-12-31')) and date('2015-09-30') >= date_start
group by id
having count(1)>1
) g on g.id=c.rec_id
...
Рейтинг: 0 / 0
10.02.2016, 19:39
    #39168003
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_S,

У вас нет опечвтки? value <> value s (value(...) - это синоним к coalsce(...) )

Посмотрите также на VARCHAR_FORMAT ( http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007110.html ).
...
Рейтинг: 0 / 0
10.02.2016, 21:04
    #39168065
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,
Отличная новость, а то меня сегодня полдня мучил вопрос про число знаков, принимаемых в окне редактора запросов ЦУ :)
...
Рейтинг: 0 / 0
10.02.2016, 21:27
    #39168075
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
CawaSPb,
¡Si, mucho gracias, amigo!
Нужно освежить в памяти
...
Рейтинг: 0 / 0
11.02.2016, 07:46
    #39168186
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,
select c.*, g.num_cnt
from table_contact c
join (
select id, count(1) num_cnt
from table_rec
where
date('2015-07-01') between date_start and coalesce(date_finish, date('9999-12-31'))
--date('2015-07-01') <= coalesce(date_finish, date('9999-12-31')) and date('2015-09-30') >= date_start
group by id
having count(1)>1
) g on g.id=c.rec_id

Отрабатывает быстро, но возвращает 0, т.е.
На вкладке Результаты запроса выводятся результаты для одного запроса.
Успешно возвращено 0 строк.
Что заведомо ложный результат...
Проверю сейчас, что выдаёт подзапрос, мб все же даты
...
Рейтинг: 0 / 0
11.02.2016, 08:24
    #39168204
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,
Так оно и есть подзапрос выдает 0

select id, count(1) num_cnt
from table_rec
where
date('2015-07-01') between date_start and coalesce(date_finish, date('9999-12-31'))
--date('2015-07-01') <= coalesce(date_finish, date('9999-12-31')) and date('2015-09-30') >= date_start
group by id
having count(1)>1

Мб я не очень точно обрисовала проблему в table_rec нет повторяющихся записей, они в table_contact по fam
Т.е
table_rec
id | num | prav | date_start | date_finish
1 1 дог 2015-01-01 2015-01-30
2 4 контр 2015-02-02 2015-27-02
3 6 договор 2014-01-10
4 8 подряд 2015-01-06
5 10 субподряд 2015-07-20 2015-07-30
6 25 договор 2010-08-01 2015-01-04
7 33 аренда 2007-07-02 2008-08-01
.
.
309974 400800 субаренда 2016-02-01
_______________________________________________

table_contact
rec_id | fam | c_code | phone | position
1 Гаврилов 495 680-07-06
6 Гаврилов 495 680-07-06 директор
25 Николаев 812 540-59-83 бух
.
.
250000 Смирнов 3522 75-01-25 гл.инж
как то так
...
Рейтинг: 0 / 0
11.02.2016, 11:45
    #39168380
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_SМб я не очень точно обрисовала проблему в table_rec нет повторяющихся записей, они в table_contact по fam
Т.е
table_rec
id | num | prav | date_start | date_finish
1 1 дог 2015-01-01 2015-01-30
2 4 контр 2015-02-02 2015-27-02
3 6 договор 2014-01-10
4 8 подряд 2015-01-06
5 10 субподряд 2015-07-20 2015-07-30
6 25 договор 2010-08-01 2015-01-04
7 33 аренда 2007-07-02 2008-08-01
.
.
309974 400800 субаренда 2016-02-01
_______________________________________________

table_contact
rec_id | fam | c_code | phone | position
1 Гаврилов 495 680-07-06
6 Гаврилов 495 680-07-06 директор
25 Николаев 812 540-59-83 бух
.
.
250000 Смирнов 3522 75-01-25 гл.инж
как то так
Я правильно понял, что в примере выше действующие договоры Гавриловых суммируются, и если их больше 1-го, то обе записи с Гавриловым должны быть выведены?
...
Рейтинг: 0 / 0
11.02.2016, 13:48
    #39168548
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,
Ожидается, что будет получен список , например, для 1 кв. 2015
Table_rec.num | table_contact.fam | table_rec.date_start*| table_rec.date_finish*
1 Гаврилов 2015-01-01 2015-01-30
25 Гаврилов 2010-08-01 2015-01-04

* table_rec.date_start и table_rec.date _finish для наглядности
**table_rec.id=table_contact.rec_id
...
Рейтинг: 0 / 0
12.02.2016, 11:44
    #39169382
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Anka_S,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select num, fam, date_start, date_finish
from (
select r.num, c.fam, r.date_start, r.date_finish, count(1) over (partition by c.fam) cnt_
from table_contact c
join table_rec r on r.id=c.rec_id
where 
date('2015-01-01') between r.date_start and coalesce(r.date_finish, date('9999-12-31'))
--date('2015-01-01') <= coalesce(r.date_finish, date('9999-12-31')) and date('2015-03-31') >= r.date_start 
) 
where cnt_>1
...
Рейтинг: 0 / 0
12.02.2016, 19:21
    #39169893
Anka_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите
Mark Barinstein,
да это то что нужно, спасибо!
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Застревает запрос на выбор дублей с подзапросом на связке 2-х таблиц, поможите чем можите / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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