Na początek chciałbym wybrać wszystkie punkty z poszczególnych par grup i obliczyć odległości między nimi, potem potraktować to średnią co da odległość między grupami.
Struktura tabeli wygląda w tej chwili następująco:
create table pts
(
pointID int not null primary key identity (1,1),
cX float not null,
cY float not null,
classN varchar(1) not null
)
GO
insert into pts values (1.1, 2.3, 'A')
insert into pts values (1.8, 3.2, 'A')
insert into pts values (2.1, 2.5, 'B')
insert into pts values (1.3, 2.7, 'C')
insert into pts values (2.1, 4.5, 'B')
insert into pts values (1.9, 3.7, 'A')
insert into pts values (3.1, 2.5, 'A')
insert into pts values (3.0, 1.6, 'B')
insert into pts values (4.2, 3.4, 'C')
Spróbowałem tego:
SELECT distinct SQRT(POWER(t.x2 - t.x1, 2) + POWER(t.y2 - t.y1, 2)) AS Odleglosc, pts.classN, x1, y1, x2, y2
FROM
( -- kombinacje punktow tych samych klas
select p.cX as x1, p.cY as y1, pts.cX as x2, pts.cY as y2, p.classN from pts p, pts
where p.classN = pts.classN
and p.pointID <> pts.pointID -- nie liczy odleglosci punktu samego ze soba
-- by nie liczyl odleglosci miedzy dwoma punktami dwukrotnie ?
) t
join pts on t.classN = pts.classN
group by pts.classN, t.x1, t.x2, t.y1, t.y2
ale DISTINCT nie pomaga mi w tym, by nie liczył odległości między analogicznymi punktami dwukrotnie.
Dla punktów różnych klas: [edit2] - nie wiem, jak ograniczyć powtórne obliczanie odległości między tymi samymi parami poszczególnych klas
select t3.c1, t3.c2, avg(t3.Odleglosc) as Odleglosc from
(
select t2.c1 as c1, t2.c2 as c2, SUM(t2.Odleglosc) as Odleglosc from
(
select SQRT(POWER(t.x2 - t.x1, 2) + POWER(t.y2 - t.y1, 2)) as Odleglosc, x1, y1, x2, y2, c1, c2
from
( -- kombinacje punktow roznych samych klas
select p.cX as x1, p.cY as y1, pts.cX as x2, pts.cY as y2, p.classN as c1, pts.classN c2 from pts p, pts
where p.classN <> pts.classN -- rozne klasy
-- and p.pointID <> pts.pointID -- nie liczy odleglosci punktu samego ze soba
-- by nie liczyl odleglosci miedzy dwoma punktami dwukrotnie ?
) t
join pts on t.c1 <> pts.classN and t.c2 <> pts.classN
group by t.x1, t.x2, t.y1, t.y2, t.c1, t.c2
-- order by c1,c2
) t2
group by t2.c1, t2.c2
) t3
group by t3.c1, t3.c2
order by t3.c1, t3.c2