Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Porównywanie rekordów - jak to ugryźć, Zaawansowane zapytanie SQL
Morfina
post 3.04.2014, 11:03:07
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 4.09.2013

Ostrzeżenie: (0%)
-----


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

Ten post edytował Morfina 3.04.2014, 11:05:54
Go to the top of the page
+Quote Post
pmir13
post 4.04.2014, 01:13:44
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
Morfina
post 4.04.2014, 11:53:38
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 4.09.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 04:25