过去 X 天的累积非重复计数

问题描述

我将 PostGresql 10.12 与下表一起使用:

|test_name|result |report_time|
|    B    |Failed |29/11/2020 |
|    A    |error  |29/12/2020 |
|    B    |passed |29/12/2020 |
|    C    |error  |29/12/2020 |
|    A    |passed |30/12/2020 |
|    B    |failure|30/12/2020 |
|    A    |error  |31/12/2020 |

我鼓励它获得所有“片状”测试的累积不同计数,即每个日期在过去一个月中没有 100% 的时间通过并且没有 100% 的时间失败的测试。
所以上表的结果将是:

|report_time|sum|comments
|31/12/2020 | 2 | range (31/12 -> 1/12),A (error + passed) + B (failure + passed) = 2
|30/12/2020 | 2 | range (30/12 -> 30/11),B (failure + passed) + A (error + passed) = 2
|29/12/2020 | 1 | range (29/12 -> 29/11),B (passed + failure) = 1
|29/11/2020 | 0 | range (29/11 -> 29/10),No flaky tests (only a single failure) = 0

我是 PostGres 的新手,我创建了以下查询

SELECT 
report_time::date,COUNT(count) OVER (
    ORDER BY report_time::date ASC 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    )
FROM (
    SELECT report_time::date,COUNT(disTINCT test_name) AS count 
    FROM tests 
    WHERE report_time > Now() - interval '30 days'
    GROUP by 1 
    HAVING COUNT(case when result in ('failure','error') then 1 else null end) > 0
    AND COUNT(case when result='passed' then 1 else null end) > 0
) as aggrQuery
ORDER BY report_time::date DESC;

但它的结果是每一行的 1,这是不正确的。
此外,由于 PostGres 版本 (10.12),我无法使用 range between preceding and current row 函数,因为它不支持它。

解决方法

如果您的 Postgres 版本不支持 range 子句,那么我建议使用子查询:

select t.report_date,(
        select count(*)
        from (
            select 1
            from tests t1
            where 
                t1.report_time >= t.report_date - interval 30 day 
                and t1.report_time < report_date + interval 1 day 
            group by t1.rest_name
            having min(t1.result) <> max(t1.result)
        ) t
    ) as res
from (select distinct report_time::date as report_date from tests) t
order by t.report_date

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...