【问题标题】:2 Level pivot using Postgresql2 使用 Postgresql 的水平枢轴
【发布时间】:2020-06-09 19:54:07
【问题描述】:

我有一个表,其架构和数据 (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】:

    不确定是否可以使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2020-12-27
      相关资源
      最近更新 更多