Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
Zdrasti

Zadachka sleduyushaya. Yest tablica gde hranyatsa ID i razniye atributi dlya etogo ID. Nu, naprimer, ID - eto tip avtomobilya, a atributi naprimer CVET, Obyom dvigatelya, dlinna i t.p.

Sushestvuyet drugaya tablica gde hranyatsa danniye o gruppah. To yest mashini s obyomom dvigatelya ot (1.6 do 2 ili 2.5 do 4) i cvet siniy doljno prinadlejat pervoy gruppe. Dlya raznih grup mogut sushestvovat kak razniye intervali, tak i razniye attributi. Granici grup ne peresekayutsa

Kak napisat zapros chtob vibrat mashinu, yeyo harakterisiki (atributi) i gruppu.

Vozmojno zapros budet dinamicheskim.

create table bucket_setup as 
select 2 ID, 2 BUCKET, 'ATTR1' ATRR, 11 MIN_VAL, 11 MAX_VAL  from dual union all
select 2 ID, 1 BUCKET, 'ATTR1' ATRR, 12 MIN_VAL, 13 MAX_VAL  from dual union all
select 2 ID, 1 BUCKET, 'ATTR1' ATRR, 1 MIN_VAL, 10 MAX_VAL  from dual union all
select 2 ID, 1 BUCKET, 'ATTR2' ATRR, 1 MIN_VAL, 10 MAX_VAL  from dual union all
select 2 ID, 1 BUCKET, 'ATTR3' ATRR, 1 MIN_VAL, 20 MAX_VAL  from dual union all
select 2 ID, 3 BUCKET, 'ATTR1' ATRR, 14 MIN_VAL, 14 MAX_VAL  from dual union all
select 2 ID, 3 BUCKET, 'ATTR1' ATRR, 11 MIN_VAL, 15 MAX_VAL  from dual union all
select 2 ID, 3 BUCKET, 'ATTR1' ATRR, 17 MIN_VAL, 17 MAX_VAL  from dual ;

select * from bucket_setup;

ID	BUCKET	ATRR	MIN_VAL	MAX_VAL
2	2	ATTR1	11	11	
2	1	ATTR1	12	13	
2	1	ATTR1	1	10	
2	1	ATTR2	1	10	
2	1	ATTR3	1	20	
2	3	ATTR1	14	14	
2	3	ATTR1	11	15	
2	3	ATTR1	17	17	

create table actual_data as
select 2 ID, 5 ATTR1, 6 ATTR2, 10 ATTR3, 5 ATTR4  from dual union all
select 2 ID, 14 ATTR1, 14 ATTR2, 10 ATTR3, 6 ATTR4  from dual union all
select 3 ID, 2 ATTR1, 4 ATTR2, 5 ATTR3, 7 ATTR4  from dual ;

select * from actual_data;


ID	ATTR1	ATTR2	ATTR3	ATTR4
2	5	6	10	5	
2	14	14	10	6	
3	2	4	5	7	


resultat zaprosa doljen bit:

ID	ATTR1	ATTR2	ATTR3	ATTR4	BUCKET
2	5	6	10	5	1	
2	14	14	10	6	3	
3	2	4	5	7		


Spasibo zaraneye
13 июн 08, 18:25    [5800152]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
Elic
Member

Откуда:
Сообщений: 29991
select d.*,
    ( select b.bucket
        from bucket_setup b
        where b.id = d.id
        group by b.bucket
        having count(distinct b.attr)
             = count(distinct case when decode(b.attr, 'ATTR1', d.attr1, 
                                                       'ATTR2', d.attr2, 
                                                       'ATTR3', d.attr3, 
                                                       'ATTR4', d.attr4
                                              ) between b.min_val and b.max_val
                                   then b.attr
                              end
                    )
    ) as bucket
  from actual_data d;
13 июн 08, 18:49    [5800200]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
stax...
Guest
  1  select
  2   a.*
  3   ,(select max(bucket) bucket from bucket_setup b
  4     where b.id=a.id and
  5  (atrr='ATTR1' and a.attr1 between min_val and max_val or
  6   atrr='ATTR2' and a.attr2 between min_val and max_val or
  7   atrr='ATTR3' and a.attr3 between min_val and max_val or
  8   atrr='ATTR4' and a.attr4 between min_val and max_val)) bucket
  9* from actual_data a
SQL> /

       ID     ATTR1     ATTR2     ATTR3     ATTR4    BUCKET
--------- --------- --------- --------- --------- ---------
        2         5         6        10         5         1
        2        14        14        10         6         3
        3         2         4         5         7

......
stax
13 июн 08, 18:51    [5800203]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
Elic
select d.*,
    ( select b.bucket
        from bucket_setup b
        where b.id = d.id
        group by b.bucket
        having count(distinct b.attr)
             = count(distinct case when decode(b.attr, 'ATTR1', d.attr1, 
                                                       'ATTR2', d.attr2, 
                                                       'ATTR3', d.attr3, 
                                                       'ATTR4', d.attr4
                                              ) between b.min_val and b.max_val
                                   then b.attr
                              end
                    )
    ) as bucket
  from actual_data d;


Shikarno, bolshoye spasibo,

A mojno oboyti hard code, naprimer vibrat iz dictionaries ?
13 июн 08, 18:53    [5800209]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
Elic
Member

Откуда:
Сообщений: 29991
faig
A mojno oboyti hard code, naprimer vibrat iz dictionaries ?
Можно, но только динамическим SQL-ем из PL/SQL-я :)
13 июн 08, 18:57    [5800219]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
stax...
  1  select
  2   a.*
  3   ,(select max(bucket) bucket from bucket_setup b
  4     where b.id=a.id and
  5  (atrr='ATTR1' and a.attr1 between min_val and max_val or
  6   atrr='ATTR2' and a.attr2 between min_val and max_val or
  7   atrr='ATTR3' and a.attr3 between min_val and max_val or
  8   atrr='ATTR4' and a.attr4 between min_val and max_val)) bucket
  9* from actual_data a
SQL> /

       ID     ATTR1     ATTR2     ATTR3     ATTR4    BUCKET
--------- --------- --------- --------- --------- ---------
        2         5         6        10         5         1
        2        14        14        10         6         3
        3         2         4         5         7

......
stax


Etot zapros ne rabotayet posle sled update

update bucket_setup set max_val = 1 where atrr = 'ATTR3' and id = 2 and bucket = 1
13 июн 08, 18:59    [5800222]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
Elic
Member

Откуда:
Сообщений: 29991
stax...
or
and, как минимум. Но тогда всё по-другому :)
Сам атрибут может пересекаться, а вот набор атрибутов должен иметь непересечение хотя бы в одном атрибуте.
13 июн 08, 19:02    [5800226]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
Elic
faig
A mojno oboyti hard code, naprimer vibrat iz dictionaries ?
Можно, но только динамическим SQL-ем из PL/SQL-я :)


A napryamuyu ni kak? Kak-to mojno svyazat?

select column_name from user_tab_columns where table_name = 'ACTUAL_DATA' and column_name <> 'ID'
13 июн 08, 19:03    [5800227]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
faig
Elic
faig
A mojno oboyti hard code, naprimer vibrat iz dictionaries ?
Можно, но только динамическим SQL-ем из PL/SQL-я :)


A napryamuyu ni kak? Kak-to mojno svyazat?

select column_name from user_tab_columns where table_name = 'ACTUAL_DATA' and column_name <> 'ID'


Elic. Posledniy vopros bil ochen gluppim. Tolko chto doper v chom problema. Da Vi pravi tolko cheres PL/SQL. Tka navernoye i sdelayu.
13 июн 08, 19:09    [5800240]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
Elic
Member

Откуда:
Сообщений: 29991
faig
faig
A napryamuyu ni kak? Kak-to mojno svyazat?
Elic. Posledniy vopros bil ochen gluppim. Tolko chto doper v chom problema. Da Vi pravi tolko cheres PL/SQL. Tka navernoye i sdelayu.
XML-ем, наверняка, можно. Но не нужно :)
13 июн 08, 19:11    [5800249]     Ответить | Цитировать Сообщить модератору
 Re: Slojnaya zadachka (po krayney mere dlya menya)  [new]
faig
Member

Откуда: Chicago ,IL
Сообщений: 146
Elic
faig
faig
A napryamuyu ni kak? Kak-to mojno svyazat?
Elic. Posledniy vopros bil ochen gluppim. Tolko chto doper v chom problema. Da Vi pravi tolko cheres PL/SQL. Tka navernoye i sdelayu.
XML-ем, наверняка, можно. Но не нужно :)


Spasibo bolshoye Esho raz. Day bog Vam zdorovya
13 июн 08, 19:12    [5800254]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить