Chciałbym obliczyć medianę w wierszu liczbowym. Jak mogę to zrobić w SQLite 4?Jak mogę obliczyć medianę wartości w SQLite?
Odpowiedz
Załóżmy, że mediana jest elementem w środku uporządkowanej listy.
SQLite (4 lub 3) nie ma żadnego wbudowanego w funkcję, ale jest to możliwe, aby to zrobić ręcznie:
SELECT x
FROM MyTable
ORDER BY x
LIMIT 1
OFFSET (SELECT COUNT(*)
FROM MyTable)/2
Gdy jest parzysta liczba rekordów, to Często definiuje się medianę jako średnią z dwóch środkowych rekordów. W tym przypadku średnia może być obliczana następująco:
SELECT AVG(x)
FROM (SELECT x
FROM MyTable
ORDER BY x
LIMIT 2
OFFSET (SELECT (COUNT(*) - 1)/2
FROM MyTable))
Połączenie parzystych i nieparzystych przypadki następnie Skutkuje to:
SELECT AVG(x)
FROM (SELECT x
FROM MyTable
ORDER BY x
LIMIT 2 - (SELECT COUNT(*) FROM MyTable) % 2 -- odd 1, even 2
OFFSET (SELECT (COUNT(*) - 1)/2
FROM MyTable))
Jest paczka rozbudowa różnych funkcji matematycznych dla sqlite3. Obejmuje funkcje grupowe, takie jak mediana.
Będzie to wymagało więcej pracy niż odpowiedzi CL, ale może się opłacać, jeśli uważasz, że będziesz potrzebować którejś z pozostałych funkcji.
http://www.sqlite.org/contrib/download/extension-functions.c?get=25
(Here jest przewodnikiem jak skompilować i rozszerzenia SQLite obciążenie).
Z opisu:
Provide mathematical and string extension functions for SQL queries using the loadable extensions mechanism. Math: acos, asin, atan, atn2, atan2, acosh, asinh, atanh, difference, degrees, radians, cos, sin, tan, cot, cosh, sinh, tanh, coth, exp, log, log10, power, sign, sqrt, square, ceil, floor, pi. String: replicate, charindex, leftstr, rightstr, ltrim, rtrim, trim, replace, reverse, proper, padl, padr, padc, strfilter. Aggregate: stdev, variance, mode, median, lower_quartile, upper_quartile.
UPDATE 12.04.2015: fixing „niezdefiniowany symbol: sinh "
Jak wspomniano w komentarzach, to rozszerzenie może nie działać poprawnie pomimo pomyślnej kompilacji.
Na przykład kompilowanie może działać, a w systemie Linux można skopiować wynikowy plik .so do /usr/local/lib
. Ale .load /usr/local/lib/libsqlitefunctions
z powłoki sqlite3
może następnie wygenerować ten błąd:
Error: /usr/local/lib/libsqlitefunctions.so: undefined symbol: sinh
kompilowanie go w ten sposób wydaje się działać:
gcc -fPIC -shared extension-functions.c -o libsqlitefunctions.so -lm
i kopiowanie pliku do /usr/local/lib
.so
nie wykazuje podobny błąd:
sqlite> .load /usr/local/lib/libsqlitefunctions
sqlite> select cos(pi()/4.0);
---> 0.707106781186548
Nie jestem pewien, dlaczego kolejność opcji do gcc ma znaczenie w tym konkretnym przypadku, ale najwyraźniej d oes.
Kredyt dla zauważając to idzie do Ludvick Lidicky „s komentarzu this blog post
Każdy pomysł, jak to zainstalować? Sam plik niewiele pomaga. – jameshfisher
@jameshfisher Spróbuj zapytać o to w innym pytaniu, oto początek. Z ciekawości próbowałem dzisiaj kompilować rozszerzenia. Postępowanie zgodnie z instrukcjami zawartymi w komentarzach C na górze pliku było dość proste (przeczytałeś plik i znalazłeś je, prawda?), Ale są pewne błędy. Kompiluje się z gcc na Ubuntu 14.04 LTS, z warunkiem wstępnym "libsqlite3-dev", czego wynikiem jest udostępniona lib "libsqlitefunctions.so". Ten sam system operacyjny Ubuntu sqlite3 próbuje załadować go, gdy otrzyma polecenie SELECT load_extension ("./ libsqlitefunctions"), ale zgłasza błąd "niezdefiniowany symbol: sinh". – Paul
To było łatwiejsze do skonfigurowania, niż się spodziewałem. Dobra droga! –
SELECT AVG (x) zwraca tylko rok od wartości dat sformatowanych jako YYYY-MM-DD, więc manipulowane rozwiązanie CL jest tylko nieznacznie, aby pomieścić daty:
SELECT DATE(JULIANDAY(MIN(MyDate)) + (JULIANDAY(MAX(MyDate)) - JULIANDAY(MIN(MyDate)))/2) as Median_Date
FROM (
SELECT MyDate
FROM MyTable
ORDER BY MyDate
LIMIT 2 - ((SELECT COUNT(*) FROM MyTable) % 2) -- odd 1, even 2
OFFSET (SELECT (COUNT(*) - 1)/2 FROM MyTable)
);
- 1. Jak znaleźć medianę
- 2. Jak obliczyć wartości procentowe w LESS CSS?
- 3. Jak zlokalizować medianę na działce KDE (seaborn)?
- 4. Znajdź medianę w drzewie wyszukiwania binarnego
- 5. obliczyć 95 percentyla wartości listy w python
- 6. SQLite: Wybór odpowiedniej wartości maksymalnej
- 7. Znaleźć medianę nieposortowanej tablicy
- 8. Jak obliczyć wartości średnie w obiektach znajdujących się w tablicy?
- 9. Znaleźć medianę tablicy?
- 10. Jak mogę obliczyć całkowitą ilość wielu produktów w JavaScript? Wartości nadchodzą w AJAX
- 11. Jak przestawić i obliczyć wartości procentowe w t-sql?
- 12. Jak mogę obliczyć różnicę między dwoma ciągami?
- 13. Jak mogę ponownie obliczyć wspólny wykładnik?
- 14. Jak obliczyć sumę wartości w std :: vector <int>
- 15. Jak mogę obliczyć sumę wartości kolumny w zapytaniu linq do sql?
- 16. Przechowywanie wartości NaN w bazie danych SQLite
- 17. Pobieranie pojedynczej wartości z SQLite w Androidzie
- 18. Jak mogę scalić wiele baz danych SQLite?
- 19. Jak mogę zablokować bazę danych sqlite?
- 20. Oblicz medianę w strukturze agregacji MongoDB
- 21. Jak mogę obliczyć całkowitą liczbę słów i znaków w textView?
- 22. Jak mogę obliczyć lub monitorować trening sieci neuronowej w pybrain?
- 23. Jak mogę obliczyć liczby miesięcy między dwiema datami w C#
- 24. Jak mogę obliczyć sygnaturę interfejsu AWS (v4) w pythonie?
- 25. Jak mogę obliczyć odwrotność rzadkiej macierzy w bibliotece Eigen
- 26. Jak mogę obliczyć obszar wewnątrz konturu w R?
- 27. R jak mogę obliczyć różnicę między rzędami w ramce danych
- 28. Highcharts: Wyświetlaj etykiety (min., Maks., Medianę itp.) W boxplot
- 29. Bardziej wydajna skumulowana tablica słupkowa matplotlib - jak obliczyć wartości dolne
- 30. Jak obliczyć sumę w JSTL
Jest to dobre rozwiązanie, ale wydaje się trudne w użyciu, jeśli chcemy obliczyć medianę wyniku "grupa po" zamiast całej tabeli. Rozważ "wybierz grp, min (val), medianę (val), max (val) z grupy table przez grp". –
@Acer - Widzę, że masz rację. W tym przypadku nie mam eleganckiego, pojedynczego rozwiązania instrukcji bez obsługi baz danych dla MEDIAN. To, co przychodzi na myśl, to: 1) Utwórz tabelę za pomocą klauzuli group by i SELECT INTO (wywołaj tę tabelę "G") w posortowanej formie i dodaj kolumnę AUTOINCREMENT (nazwij ją kolumną "i"). 2) Utwórz zapytanie, które oblicza (max (G.i) + min (G.i))/2.0 dla każdej grupy (wywołaj tę kolumnę "x"). 3) Używając tabeli Wybierz, wybierz wpisy z G, gdzie ABS (G.i-Pick.x) <1. Jeśli weźmiesz średnią z tego ostatniego stołu, otrzymasz odpowiedź dla każdej grupy. Nie ładne. –