所以我有一个包含三列的表: 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。
希望这很有道理。
答案 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_time
和process_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;