Witam,
pierwszy raz muszę tak "mocno" ingerować w przetworzenie wyników pobieranych z bazy danych, że nie mam za bardzo pomyslu (i pewnie wiedzy) aby uzyskać końcowy, pożądany efekt..
O co chodzi?
Mam tabele z danymi (dane wejściowe):
id | user_id | total_value | partial1_value | parial2_value | partial3_value | partial4_value
1 | 1 | 30 | 10 | 8 | 7 | 5
2 | 2 | 35 | 10 | 10 | 8 | 7
3 | 2 | 31 | 9 | 9 | 8 | 7
4 | 3 | 29 | 10 | 10 | 4 | 5
5 | 3 | 29 | 10 | 8 | 4 | 7
I teraz chciałbym:
- Wybrać tylko najwyższy total_value dla danego użytkownika (user_id). Tutaj akurat wpadłem na kod który pomaga uzyskać pożądany efekt:
SELECT * FROM table AS t1
WHERE (SELECT COUNT(*) FROM table AS t2 WHERE t2.user_id = t1.user_id AND t2.total_value > t1.total_value) = 0;
W ten sposób pozbywamy się wiersza z wartością total_value = 31.
- Jeśli wartość total_value jest równa dla danego użytkownika powinien zostać ten wynik, który ma większa liczbę 10-tek, potem 9-tek, etc.. czyli musiałby być zastosowany jakiś algorytm, który mógłby sprawdzić ile w danym wierszu jest np. 10-tek, i tak jak widać na przykładzie, powinien zostać wiersz o id = 4.
..czyli wyjściowy wynik miałby wyglądać tak:
id | user_id | total_value | partial1_value | parial2_value | partial3_value | partial4_value
1 | 1 | 30 | 10 | 8 | 7 | 5
2 | 2 | 35 | 10 | 10 | 8 | 7
4 | 3 | 29 | 10 | 10 | 4 | 5
Jakie macie pomysły, aby uzyskać taki efekt ? Proszę o wszelakie sugestie, kawałki kodu, słowa klucze które pomogłyby mi dojść do końcowego rezultatu.. Osobiście wydaje mi się, że trzeba będzie użyć do tego procedury, ale co ta procedura powinna zawierać :P (tzn. jak np. sprawdzać te wiersze pod względem występowania ilości 10-tek, 9-tek i porównywania tego względem kolumny user_id ? )
Pozdrawiam,
Michał