Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z group by?
qww
post 16.12.2011, 10:09:26
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


Witam,
Z góry przepraszam za to, że pytam o prost sprawy.
Bardzo mi sie spieszy z rozwiązaniem tej kwestii i nie potrafię znaleźć rozwiązania więc może ktoś mi pomoże.
otóż ma tabelkę
Objectid input_fid near_fid distance
11,00 0,00 53,00 8221,62
133,00 1,00 56,00 16938,04
243,00 2,00 33,00 8079,95
334,00 3,00 43,00 15139,67
431,00 4,00 36,00 32085,84
455,00 5,00 46,00 12959,51
572,00 6,00 17,00 12869,29
638,00 7,00 77,00 11443,15
759,00 8,00 14,00 14203,49
831,00 9,00 62,00 13132,38
937,00 10,00 85,00 15232,27
1035,00 11,00 72,00 16046,21
1127,00 12,00 8,00 28397,36
1186,00 13,00 79,00 12050,02
1306,00 14,00 8,00 14203,49
1431,00 15,00 74,00 18573,17
1478,00 16,00 14,00 17488,94
1557,00 17,00 6,00 12869,29
1669,00 18,00 38,00 202651,54
1730,00 19,00 70,00 10784,56
1821,00 20,00 62,00 13923,87
1926,00 21,00 85,00 13091,27
2038,00 22,00 73,00 20537,75
2072,00 23,00 90,00 8857,32
2243,00 24,00 67,00 9174,08
2333,00 25,00 67,00 7053,37
2396,00 26,00 52,00 13322,48
2461,00 27,00 42,00 17165,78
2574,00 28,00 61,00 13831,92
2635,00 29,00 71,00 17653,86
2734,00 30,00 84,00 11584,38
2813,00 31,00 45,00 13662,87
2806,00 31,00 20,00 14141,01
2807,00 31,00 79,00 20203,97
2812,00 31,00 62,00 23792,41
2825,00 31,00 21,00 26968,16
2803,00 31,00 13,00 27057,03
2826,00 31,00 85,00 27762,05
2817,00 31,00 30,00 28320,68
2811,00 31,00 19,00 32523,71
2805,00 31,00 9,00 34356,95
2824,00 31,00 84,00 35478,76
2827,00 31,00 10,00 36756,91
2810,00 31,00 70,00 38232,21
2814,00 31,00 81,00 38742,74
2823,00 31,00 89,00 42037,02
2816,00 31,00 6,00 42261,82
...
w której podane sa odległości pomiędzy input_fid i near_fid. Potrzebuję tylko wartości z najmniejszymi odległościami (tak jak w przypadku input_fid od 0 do 30). Wartości od 0 do 30 usuwałem ręcznie, ale moja cierpliwośc się skończyła.
Wiem, że na pewno jakoś się to da zrobić w sql. Niestety moje próby z distictem, inner joinem, minimum, group by, doprowadziły tylko do połowicznego efektu:(
Kwerenda2: SELECT DISTINCT input_fid, min(distance) FROM odl1950 group by input_fid niestety nie pokazuje kolumny near_fid.

Kwerenda3: SELECT * FROM kwerenda2 INNER JOIN odl1950 ON kwerenda2.expr1001=odl1950.distance;
pokazała w zasadzie to co chciałem tylko, że wartości wyświetlane sa podwójnie (po dwa wiersze w tabeli)

Nie wiem co z tym zrobić.

Pomoże ktoś?
Dziekuję

Go to the top of the page
+Quote Post
Sephirus
post 16.12.2011, 10:31:52
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


  1. SELECT input_fid, near_fid, min(distance) AS distance FROM odl1950 GROUP BY input_fid


To nie starczy?


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
qww
post 16.12.2011, 10:42:12
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


no niestety cos nie działa:(
pojawia sie info:
Odwołanie cykliczne spowodowane przez alias 'distance' na liście SELECT definicji kwerendy.



jak zmieniam na distance 1:
SELECT input_fid, near_fid, min(distance) AS distance1 FROM odl1950 GROUP BY input_fid

to znowu jest problem z group by:
Problem z wykonaniem kwerendy, która nie zawiera podanego wyrażenia near-fid jako elementu funkcji agregującej
Go to the top of the page
+Quote Post
Sephirus
post 16.12.2011, 10:57:08
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


  1. SELECT input_fid, (SELECT near_fid, min(distance) FROM odl1950) near_fid2 FROM odl1950 GROUP BY input_fid


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
qww
post 16.12.2011, 16:18:08
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


no niestety sad.gif
uzupełniłem przecinek bo zgłaszało błąd składni:
SELECT input_fid, (SELECT near_fid, min(distance) FROM odl1950), near_fid2 FROM odl1950 GROUP BY input_fid
ale dalej jest nie to:(

Komunikat:
"Napisano podkwerendę, która może zwrócić więcej niż jedno pole, bez użycia zastrzeżonego słowa EXISTS w klauzuli FROM kwerendy głównej. Zmień instrukcję podkwerendy tak, any wybierała tylko jedno pole."


Można zmienić tylko jak?
Go to the top of the page
+Quote Post
zegarek84
post 16.12.2011, 16:23:19
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


jak dałeś zestaw danych to z tych danych daj jeszcze dokładnie zestaw danych wynikowych gdyż np. ja choć przeczytałem ten temat wcześniej to ni w ząb nie zrozumiałem o co Ci chodzi...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
qww
post 16.12.2011, 16:34:36
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


jasne...
rzeczywiście może jest trochę mało czytelnie...
otóż:
tabela przedstawia odległości pomiędzy punktami, mierzone każdy do każdego (pomiędzy punktami o nr w kolumnach input_fid i near_fid)
Wiersze z wartościami input_fid do wartości 30 wyczyściłem ręcznie w taki sposób, że zostało tylko po jednym wierszu dla kazdego punktu z input_fid z najkrótszym dystansem.
I to samo chciałbym uzyskać dla pozostałych, a że jest ich ponad kilkaset fajnie by było użyć kwerendki.
Go to the top of the page
+Quote Post
zegarek84
post 16.12.2011, 17:45:46
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Widzę, że masz unikalne Objectid... dawno nie pisałem SQL'a więc może dało się to lepiej zrobić... u mnie to zadziałało:
  1. SELECT * FROM odl1950 WHERE odl1950.Objectid IN
  2. (SELECT
  3. (SELECT Objectid FROM odl1950 WHERE odl1950.input_fid = odl.input_fid ORDER BY distance LIMIT 1) AS Objectid
  4. FROM (SELECT DISTINCT input_fid FROM odl1950) AS odl)
  5. ORDER BY input_fid


a zapytanie z grupowaniem mogło by wyglądać w ten sposób:
  1. SELECT odl2.* FROM
  2. (SELECT DISTINCT input_fid, min(distance) AS dis FROM odl1950 GROUP BY input_fid) AS odl1
  3. LEFT JOIN odl1950 AS odl2
  4. ON odl1.input_fid = odl2.input_fid AND odl1.dis = odl2.distance
  5. ORDER BY odl2.input_fid


w zasadzie to ostanie ORDER BY mógłbyś sobie darować gdyż to tylko kosmetyczna sprawa wyświetlenia...

Ten post edytował zegarek84 16.12.2011, 18:31:21


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
qww
post 16.12.2011, 18:28:28
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


u mnie w accessie 2007 wywala niestety błąd składniowy:(

a jednak to drugie działąsmile.gif
bardzo dziękujęexclamation.gif!
Go to the top of the page
+Quote Post
zegarek84
post 16.12.2011, 18:29:26
Post #10





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


sorki ale nie zauważyłem, że to ma być do accessa - w zasadzie nigdy go nie używałem...

ps. a może w pierwszym zapytaniu czepiał się o apostrofy "`" przy Objectid?? - sprawdź teraz z czystej ciekawości ;]

Ten post edytował zegarek84 16.12.2011, 18:32:43


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
qww
post 16.12.2011, 18:53:55
Post #11





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 16.12.2011

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


no cóż apostrof nie pomógł ale nic to - ważne, że drugi sposób działa - jeszcze raz dziękuję
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: 26.04.2024 - 03:32