Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中计算列中的重复值?_Sql_Postgresql - Fatal编程技术网

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

如何在PostgreSQL中计算列中的重复值?,sql,postgresql,Sql,Postgresql,您好,我有一个如下表,我想计算status列中的重复值。我不想计算整个重复值。例如,我只想计算在值更改为Idle之前脱机显示的数量 这就是我想要的结果。多谢各位 这通常被称为缺口和孤岛 一种方法是使用两个行号序列 检查查询的每个中间结果以了解其工作原理 WITH CTE_rn AS ( SELECT status ,dt ,ROW_NUMBER() OVER (ORDER BY dt) as rn1 ,ROW_NUMBER(

您好,我有一个如下表,我想计算status列中的重复值。我不想计算整个重复值。例如,我只想计算在值更改为Idle之前脱机显示的数量

这就是我想要的结果。多谢各位


这通常被称为缺口和孤岛

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

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

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)
;
结果

具有 cte1作为选择状态, 日期 工作站 状态=按工作站顺序按日期划分的分区滞后状态时的情况 然后0 否则,1号端发生变化 从测试来看, cte2作为选择状态, 日期 工作站 按工作站顺序按日期组更改分区的SUM数量 来自cte1 选择状态、计数*计数、工作站、MINdate从、MAXdate到 来自cte2 分组编号、状态、工作站;
样本数据最好以如下方式表示。有关如何创建美观的表格的一些提示,请参见。
| status  | cnt |
|---------|-----|
| offline | 2   |
| idle    | 1   |
| offline | 2   |
| idle    | 1   |