Załóżmy, że mam tabelę z kolumną numeryczną (nazwijmy ją „wynikiem”).
Chciałbym wygenerować tabelę zliczeń, która pokazuje, ile razy wyniki pojawiły się w każdym zakresie.
Na przykład:
zakres punktacji | liczba wystąpień ------------------------------------- 0–9 | 11 10–19 | 14 20–29 | 3) ... | ...
W tym przykładzie było 11 rzędów z wynikami w przedziale od 0 do 9, 14 rzędów z wynikami w przedziale od 10 do 19 oraz 3 rzędy z wynikami w przedziale 20-29.
Czy istnieje prosty sposób na skonfigurowanie tego? Co polecasz?
sql
sql-server
tsql
Hugh
źródło
źródło
Alternatywne podejście polegałoby na przechowywaniu zakresów w tabeli zamiast osadzania ich w zapytaniu. W efekcie powstałby stół, który nazywa się Ranges, który wygląda następująco:
I zapytanie, które wygląda tak:
Oznacza to ustawienie tabeli, ale byłoby łatwe do utrzymania, gdy zmienią się pożądane zakresy. Żadne zmiany kodu nie są konieczne!
źródło
Widzę tutaj odpowiedzi, które nie będą działać w składni SQL Server. Użyłbym:
EDYCJA: patrz komentarze
źródło
W postgres (gdzie
||
jest operator konkatenacji ciągu):daje:
źródło
Moim zdaniem odpowiedź Jamesa Currana była najbardziej zwięzła, ale wyniki nie były prawidłowe. W przypadku SQL Server najprostsza instrukcja wygląda następująco:
Zakłada się, że tymczasową tabelę #Scores użyłem do jej przetestowania, właśnie zapełniłem 100 wierszy losową liczbą od 0 do 99.
źródło
źródło
źródło
To pozwoli ci nie musieć określać zakresów i powinno być agnostyczne dla serwera SQL. Matematyka FTW!
źródło
Zrobiłbym to trochę inaczej, aby skalować bez konieczności definiowania każdego przypadku:
Nie testowano, ale masz pomysł ...
źródło
źródło
Upewnij się, że używasz słowa innego niż „zakres”, jeśli jesteś w MySQL, w przeciwnym razie wystąpi błąd podczas uruchamiania powyższego przykładu.
źródło
Ponieważ sortowana kolumna (
Range
) jest ciągiem, zamiast sortowania numerycznego stosuje się sortowanie ciągów / słów.Tak długo, jak ciągi mają zera zerujące długości liczb, sortowanie powinno być semantycznie poprawne:
Jeśli zakres jest mieszany, po prostu wstaw dodatkowe zero:
źródło
Próbować
źródło
Być może pytasz o utrzymanie takich rzeczy ...
Oczywiście będziesz wywoływać pełne skanowanie tabeli dla zapytań, a jeśli tabela zawierająca wyniki, które muszą zostać zebrane (agregacje) jest duża, możesz chcieć rozwiązania o lepszej wydajności, możesz utworzyć tabelę pomocniczą i zastosować reguły, takie jak
on insert
- możesz na to spojrzeć.Jednak nie wszystkie silniki RDBMS mają reguły!
źródło