2使用Postgresql的水平枢轴

问题描述 投票:0回答:1

我有一个表,其表以及数据(table_name:raw_data)似乎是这个:

name | category | clear_date |

A    | GOOD     | 2020-05-30 |
A    | GOOD     | 2020-05-30 |
A    | GOOD     | 2020-05-30 |
A    | GOOD     | 2020-05-30 |
A    | BAD      | 2020-05-30 |
A    | BAD      | 2020-05-30 |

现在,如果我使用以下语句执行“ groupby”操作:

 SELECT name, category, date(clear_date), count(clear_date)
 FROM raw_data
 GROUP BY name, category, date(clear_date)
 ORDER BY name

我得到以下答案:

  name | caetgory | date      | count |
  A    | GOOD     |2020-05-30 |  4    |
  A    | BAD      |2020-05-30 |  1    |
  A    | BAD      |2020-05-31 |  1    |

为了产生以下格式的枢轴:

 name | category | 2020-05-30 | 2020-05-31 |
 A    | GOOD     | 4          |   NULL     | 
 A    | BAD      | 1          |   1        |

我正在使用以下查询:

 select * from crosstab (
    'select name, category, date(clear_date), count(clear_date) from raw_data group by name, category, date(clear_date) order by 1,2,3',
    'select distinct date(clear_date) from raw_data order by 1'
    )
    as newtable (
    node_name varchar, alarm_name varchar, "2020-05-30" integer, "2020-05-31" integer
)
ORDER BY name

但是我得到的结果如下:

    name | category | 2020-05-30 | 2020-05-31 |
    A    | BAD      |    4       | 1          |

任何人都可以尝试建议我如何实现上述结果。交叉表似乎会自动删除A的重复条目。

postgresql pivot-table crosstab postgres-crosstab
1个回答
0
投票

[不确定是否可以使用crosstab,因为您在某些日期缺少记录。这是一个示例,如何获得预期的结果,但不确定您需要什么。无论如何希望这会有所帮助。

SELECT r1.*, r2.counter AS "2020-05-30", r3.counter AS "2020-05-31"
FROM (
    SELECT DISTINCT name, category
    FROM raw_data
) AS r1
LEFT JOIN (
    SELECT name, category, count(*) AS counter
      FROM raw_data
     WHERE clear_date = '2020-05-30'
     GROUP BY name, category
) AS r2 ON (r2.category = r1.category AND r2.name = r1.name)
LEFT JOIN (
    SELECT name, category, count(*) AS counter
      FROM raw_data
     WHERE clear_date = '2020-05-31'
     GROUP BY name, category
) AS r3 ON (r3.category = r1.category AND r3.name = r1.name)
ORDER BY r1.category DESC;
© www.soinside.com 2019 - 2024. All rights reserved.