sql - 如何计算 PostgreSQL 中列中的重复值?

标签 sql postgresql

您好,我有一个如下所示的表格,我想计算状态列中的重复值。我不想计算总体重复值。例如,我只想统计有多少个“Offline”出现,直到该值变为“Idle”。

enter image description here

这就是我想要的结果。谢谢。

enter image description here

最佳答案

这通常称为间隙和岛屿。

一种方法是使用两个行号序列。

检查查询的每个中间结果以了解其工作原理。

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   |

关于sql - 如何计算 PostgreSQL 中列中的重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60519026/

相关文章:

python pandas to_sql 与 sqlalchemy : how to speed up exporting to MS SQL?

MySQL查询多对多关系表

javascript - 找不到 Sequelize n :m relation tables

sql - 使用连接和 "ghost"引用优化 postrgeSQL 查询?

php - 从 PHP 连接到 postgresql 数据库的首选方法是什么?

mysql - SQL 替换值通配符

php - 位于 2 个不同表中的 2 个数字之间的差异的平均值

sql - 使用 R 对两列进行分组并计算不同值

postgresql - PostgreSQL 中包含 insert into 子句的合并语句失败

ruby-on-rails - 在不同时间为每个作业运行一个 cron 作业