Как написать, выбирая группу с несколькими счетчиками по дате PostgreSQL - PullRequest
0 голосов
/ 07 мая 2019

Помогите мне выбрать несколько подсчетов с диапазонами оценок по дате с помощью postgreSQL

|date|score|
|----|-----|
|12/1|2    |
|12/1|4    |
|12/1|5    |
|12/2|3    |

|date|low0-2|high3-4|perfect|
|----|------|-------|-------|
|12/1|1     |1      |1      |
|12/2|0     |1      |0      |

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

демо: дб <> скрипка

Вы можете сделать это, используя предложение FILTER для группирования, которое является специальным способом Postgres:

SELECT
    my_date,
    COUNT(score) FILTER (WHERE score BETWEEN 0 AND 2) AS "low0-2",
    COUNT(score) FILTER (WHERE score BETWEEN 3 AND 4) AS "high3-4",
    COUNT(score) FILTER (WHERE score = 5) AS "perfect"
FROM
    scores
GROUP BY my_date
ORDER BY my_date

В противном случае вы можете воспользоваться более стандартным способом SQL, используя предложение CASE:

SELECT
    my_date,
    SUM(
        CASE 
            WHEN score BETWEEN 0 AND 2 THEN 1
            ELSE 0
        END
    ) AS "low0-2",
    SUM(
        CASE 
            WHEN score BETWEEN 3 AND 4 THEN 1
            ELSE 0
        END
    ) AS "high3-4",
    SUM(
        CASE 
            WHEN score = 5 THEN 1
            ELSE 0
        END
    ) AS "perfect"
FROM
    scores
GROUP BY my_date
ORDER BY my_date
0 голосов
/ 07 мая 2019

Если я правильно интерпретирую ваш пример, вторая часть - это то, что вы хотите получить как вывод из первой, верно?

Вот, пожалуйста,

SELECT
    date,
    count(*) FILTER (WHERE score < 3) AS "low0-2",
    count(*) FILTER (WHERE score > 2 AND score < 5) AS "high3-4",
    count(*) FILTER (WHERE score > 4) AS "perfect"
FROM
    my_scores
GROUP BY 1
ORDER BY 1;

Производство (использовались реальные даты для тестирования):

    date    | low0-2 | high3-4 | perfect 
------------+--------+---------+---------
 2018-12-01 |      1 |       1 |       1
 2018-12-02 |      0 |       1 |       0
(2 rows)

Интерактивный пример: https://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=2a7f160954020cdffc799e8a02491dc5

...