Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z group by?
Forum PHP.pl > Forum > Bazy danych > Access
qww
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ę

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


To nie starczy?
qww
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
Sephirus
  1. SELECT input_fid, (SELECT near_fid, min(distance) FROM odl1950) near_fid2 FROM odl1950 GROUP BY input_fid
qww
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?
zegarek84
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...
qww
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.
zegarek84
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...
qww
u mnie w accessie 2007 wywala niestety błąd składniowy:(

a jednak to drugie działąsmile.gif
bardzo dziękujęexclamation.gif!
zegarek84
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 ;]
qww
no cóż apostrof nie pomógł ale nic to - ważne, że drugi sposób działa - jeszcze raz dziękuję
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.