Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Microsoft SQL Server / MSDE _ Porównywanie rekordów - jak to ugryźć

Napisany przez: Morfina 3.04.2014, 11:03:07

Witam ponownie,
Od kilku dni próbuję rozwiązać następujące zagadnienie:

Dane:


Dane wstępnie obrobione tzn. tak aby łatwiej było wytłumaczyć.


Zadanie:
Znaleźć zakupy (ID definiuje zakup), które są podobne do siebie. Czy też znaleźć pary ID, które mają ze sobą coś wspólnego.
Najprościej jest odnaleźć takie same, czyli w załączonym przykładzie ID 1 = ID 4 nieco trudniej stwierdzić, że np. ID 6 ma sporo wspólnego z ID 7 różnią się tylko o 4 Gruszki lub ID 3 od ID 4 różnią się o jedno jabłko.
Właśnie nad zrealizowaniem części drugiej (po nieco trudniej) główkuję i jak na razie z mizernym rezultatem?
Gdyby któryś z Forumowiczów mógł skierować Mnie na nowe tory myślenia, będę zobowiązany.

Pozdrawiam Morf

Napisany przez: pmir13 4.04.2014, 01:13:44

Skoro interesują nas wszystkie możliwe pary rekordów to w najgorszym przypadku będziemy mieć iloczyn kartezjanski przy self-joinie, ale możemy to nieco uprościć. Zakładając, że dwa rekordy są podobne jeżeli dla tego samego owocu mają taką samą ilość, to możemy dodać to jako warunek złączenia. W ten sposób pomijamy wszystkie pary, które nie mają ze sobą nic wspólnego a także dostajemy dane w formacie dość wygodnym do pogrupowania, bo wystarczy w każdej grupie dla identycznych par ID policzyć rekordy i otrzymujemy liczbę zgodnych pozycji zakupów. Czyli:

  1. SELECT z1.ID AS ID1, z2.ID AS ID2, COUNT(*) AS podobienstwo
  2. FROM zakupy z1 JOIN zakupy z2
  3. ON z1.ID < z2.ID AND z1.Owoc = z2.Owoc AND z1.Ilosc = z2.Ilosc
  4. GROUP BY z1.ID, z2.ID
  5. ORDER BY podobienstwo DESC, z1.ID, z2.ID


Napisany przez: Morfina 4.04.2014, 11:53:38

Kolego Pmir13 Wielkie Dzięki. thumbsupsmileyanim.gif
Jak dla mnie Mistrzostwo Świata, na to bym nie wpadł.

  1. SELECT ID,ID2,podobienstwo,Ilosc,podobienstwo*100/Ilosc AS Procent
  2. FROM
  3. (SELECT Tab1.ID AS ID,ID2,podobienstwo, COUNT(Owoc) AS Ilosc
  4. FROM [Testowa_SQL_Nauka].[dbo].[Owoce] AS Tab1 JOIN (SELECT z1.ID AS ID1, z2.ID AS ID2, COUNT(*) AS podobienstwo
  5. FROM [Testowa_SQL_Nauka].[dbo].[Owoce] AS z1 JOIN [Testowa_SQL_Nauka].[dbo].[Owoce] AS z2
  6. ON z1.ID < z2.ID AND z1.Owoc = z2.Owoc AND z1.Ilosc = z2.Ilosc
  7. GROUP BY z1.ID, z2.ID
  8. ) AS Tab2
  9. ON Tab1.ID = Tab2.ID1
  10. GROUP BY Tab1.ID,ID1,ID2,podobienstwo) AS Tab3
  11. ORDER BY Procent DESC,Tab3.ID;


Tak wygląda wersja finalna.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)