postgresql:基于两个不同的时间戳列与create_time的计数创建图

时间:2019-03-20 06:09:37

标签: postgresql

所以我有一个包含三列的表: create_time(表条目的日期),process_time(已处理日期顺序),report_time(已报告日期顺序)。从时间顺序上讲,顺序始终是以下顺序:process_time> report_time> create_time。

process_time和report_time都可以与create_time或它们自己不同。但是我要比较的主要列是create_time。

我想创建一个图形,其中X列是create_time的日期,而Y列是create_time日期出现在process_time或report_time列中的次数的计数。不是对有值的process_time / report_time单元格进行计数,而是对实际日期进行计数。

非常简单的示例:

| create_time | process_time | report_time |
|-------------|--------------|-------------|
| 2019-02-01  | 2019-01-27   | 2019-01-28  |
| 2019-02-20  | 2019-02-20   | 2019-02-20  |
| 2019-02-26  | 2019-02-20   | 2019-02-25  |

在此示例中,该图将显示第一个create_time日期的计数为0,因为没有与该日期匹配的process_time或report_time值。对于第二个create_time,它将显示为2的process_time和1个报告时间;对于第三个create_time,将显示为0。

希望这很有道理。

1 个答案:

答案 0 :(得分:1)

创建示例表:

int (*ptr)[y] = malloc( sizeof(int[x][y]) );
...
ptr[i][j] = ... ; // more convenient syntax for access
...
free(ptr);

该查询首先选择所有不同的CREATE TABLE example_table(create_time DATE, process_time DATE, report_time DATE); INSERT INTO example_table(create_time, process_time, report_time) VALUES ('2019-02-01', '2019-01-27', '2019-01-28'), ('2019-02-20', '2019-02-20', '2019-02-20'), ('2019-02-26', '2019-02-20', '2019-02-25'); 值,然后计算该日期在create_timeprocess_time列中的出现次数。

report_time

结果:

WITH create_dates AS (
  SELECT DISTINCT create_time FROM example_table
)
SELECT * FROM create_dates cd
  CROSS JOIN LATERAL (
    SELECT
           COUNT(*) FILTER (WHERE cd.create_time = et.process_time) as process_time_count,
           COUNT(*) FILTER (WHERE cd.create_time = et.report_time) as report_time_count
    FROM example_table et
    ) temp;