помогите с запросом

rstrelba
Дата: 30.07.2012 19:33:46
Привет олл.
помогите плз. с запросом
Есть таблица с значениями параметров товаров

create table ITEMPARAMV
(
ITEMPARAMV_ID bigint not null primary key,
ITEM_ID bigint not null, -- идентификатор товара
ITEMPARAM_ID bigint not null, -- ссылка на тип параметра
ITEMPARAM_VALUE bigint -- значение параметра
)

соответственно по каждому товару может быть 10-20 значений
параметров.

ITEMPARAM_ID - тип параметра, ссылка на справочник,
например вес, длина, ширина, глубина, цвет, ....

ITEMPARAM_VALUE - ссылка на справочник значений, но в нашем
случае это не важно, просто число

на вход запроса додается идентификатор товара, т.е. фильтруем по
ITEM_ID

на выходе имеем список похожих товаров. Похожесть товара
регулируется количеством совпавших пар (ITEMPARAM_ID, ITEMPARAM_VALUE) для
остальных товаров, отсортированных в обратном порядке.

Как-то так.
Dimitry Sibiryakov
Дата: 30.07.2012 19:38:07

JOIN GROUP BY HAVING ORDER BY Count(*) DESC

Как-то так.

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 30.07.2012 20:10:41
rstrelba,

что следует выводить для товара, которому вообще нет аналогов ? выводить ли саму строку с ним или нет ?
Если выводить, то придется делать доп. группировку, чтобы получить для каждого товара общее кол-во их параметров, по которым есть совпадения с другими товарами. Эта группировка в нижеследующем запросе - СТЕ с именем 'd'.
DDL (у товаров с part_id=100 и 700 нет никаких аналогов; у товаров 300, 400 и 500 - есть уникальные только для них параметры, отсутствующие у остальных товаров):
+
recreate table t(id int primary key, part_id int, prm_id int); commit;
insert into t values( 1, 100,91);
insert into t values( 2, 100,92);
insert into t values( 3, 100,93);
insert into t values( 4, 100,95);
insert into t values( 5, 100,99);
insert into t values( 6, 200, 2);
insert into t values( 7, 200, 3);
insert into t values( 8, 200, 5);
insert into t values( 9, 200, 8);
insert into t values(10, 300, 3);
insert into t values(11, 300, 5);
insert into t values(12, 300, 8);
insert into t values(13, 300, 9);
insert into t values(14, 300,10);
insert into t values(15, 300,13);
insert into t values(16, 300,45);
insert into t values(17, 400,10);
insert into t values(18, 400,13);
insert into t values(19, 400,15);
insert into t values(20, 500, 1);
insert into t values(21, 500, 2);
insert into t values(22, 500, 3);
insert into t values(23, 500, 4);
insert into t values(24, 500,77);
insert into t values(25, 500,79);
insert into t values(26, 600, 9);
insert into t values(27, 600,13);
insert into t values(28, 700,63);
insert into t values(29, 700,64);
insert into t values(30, 700,65);
commit;
Query:
with
c as(
    select t1.part_id tpart, tx.part_id xpart, count(tx.prm_id) similar_cnt -- tx.prm_id xprm
    from t t1
    left join t tx on t1.part_id<>tx.part_id and t1.prm_id=tx.prm_id
    group by t1.part_id, tx.part_id
)
,d as(
    select tpart,max(similar_cnt) similar_max
    from c
    group by tpart
)
--select * from d
select c.tpart,c.xpart,c.similar_cnt
from c
join d on c.tpart=d.tpart and (c.similar_cnt>0 or d.similar_max=0)
Result:
TPARTXPARTSIMILAR_CNT
1000
2003003
2005002
3002003
3004002
3005001
3006002
4003002
4006001
5002002
5003001
6003002
6004001
7000
При заворачивании запроса в ХП надо добавить фильтр по входному a_part_id. Для любого существующего в справочнике товара будет выведена как минимум 1 запись. Если по нему нет аналогов, то поле xpart будет содержать null, иначе - id'шник аналога и кол-во совпадающих параметров.
ORDER BY добавить по вкусу.
rstrelba
Дата: 30.07.2012 20:12:44
Таблоид,
спасибо, сделал так

select x2.item_id,
count(distinct(x2.itemparam_id)),
(select item_name from item where item_id=x2.item_id)

from itemparamv x1 left outer join itemparamv x2 on (x1.itemparam_id=x2.itemparam_id and x1.ITEMPARAM_VALUE=x2.ITEMPARAM_VALUE)

where
x1.item_id=20139 and
x2.item_id<>20139

group by 1
order by 2 desc
S.PR
Дата: 30.07.2012 21:36:46
что-б на это itemparamv x1 left outer join itemparamv x2 не смотреть,
я лучше-бы хэпэшку сделал.