Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównywanie rekordów - jak to ugryźć
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Morfina
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
pmir13
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

Morfina
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.