问题描述
我将 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