PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

sql - grupuj według zakresów, aby uwzględnić zakresy bez wartości

Wypróbuj to zapytanie (również na SQL Fiddle ):

WITH ranges AS (
    SELECT (ten*10)::text||'-'||(ten*10+9)::text AS range,
           ten*10 AS r_min, ten*10+9 AS r_max
      FROM generate_series(0,9) AS t(ten))
SELECT r.range, count(s.*)
  FROM ranges r
  LEFT JOIN scores s ON s.score BETWEEN r.r_min AND r.r_max
 GROUP BY r.range
 ORDER BY r.range;

EDYTUJ:

Możesz łatwo dostosować zakres, zmieniając parametry na generate_series() . Możliwe jest użycie następującej konstrukcji, aby upewnić się, że ranges zawsze pokryje twoje wyniki:

SELECT (ten*10)::text||'-'||(ten*10+9)::text AS range,
       ten*10 AS r_min, ten*10+9 AS r_max
  FROM generate_series(0,(SELECT max(score)/10 FROM scores)) AS t(ten))

dla ranges CTE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. czy możesz używać bibliotek w PL/Perl

  2. PostgreSQL - wyświetlanie pierwszego wiersza jako sumy pozostałych wierszy

  3. Jak napisać sprzężenie z tymi nietypowymi kryteriami dopasowania?

  4. Zapytanie, które ignoruje spacje

  5. SQLAlchemy:filtrowanie według wartości przechowywanych w zagnieżdżonej liście pola JSONB