Как посчитать повторяющиеся значения в столбце в PostgreSQL? - PullRequest
1 голос
/ 04 марта 2020

Привет У меня есть таблица, как показано ниже, и я хочу подсчитать повторяющиеся значения в столбце состояния. Я не хочу вычислять общие повторяющиеся значения. Например, я просто хочу посчитать, сколько «Offline» появляется, пока значение не изменится на «Idle».

enter image description here

Это результат, который я хотел , Спасибо.

enter image description here

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Это часто называют пробелами и островками.

Один из способов сделать это - две последовательности номеров строк.

Изучить каждый промежуточный результат запроса, чтобы понять, как он работает .

WITH
CTE_rn
AS
(
    SELECT
        status
        ,dt
        ,ROW_NUMBER() OVER (ORDER BY dt) as rn1
        ,ROW_NUMBER() OVER (PARTITION BY status ORDER BY dt) as rn2
    FROM
        T
)
SELECT
    status
    ,COUNT(*) AS cnt
FROM
    CTE_rn
GROUP BY
    status
    ,rn1-rn2
ORDER BY
    min(dt)
;

Результат

| status  | cnt |
|---------|-----|
| offline | 2   |
| idle    | 1   |
| offline | 2   |
| idle    | 1   |
0 голосов
/ 04 марта 2020
WITH 
cte1 AS ( SELECT status, 
                 "date", 
                 workstation, 
                 CASE WHEN status = LAG(status) OVER (PARTITION BY workstation ORDER BY "date")
                      THEN 0
                      ELSE 1 END changed
          FROM test ),
cte2 AS ( SELECT status, 
                 "date", 
                 workstation, 
                 SUM(changed) OVER (PARTITION BY workstation ORDER BY "date") group_num 
          FROM cte1 )
SELECT status, COUNT(*) "count", workstation, MIN("date") "from", MAX("date") "till"
FROM cte2
GROUP BY group_num, status, workstation;

скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...