【问题标题】:How to flatten a table from row to columns如何将表格从行展平到列
【发布时间】:2019-11-15 08:33:10
【问题描述】:

我使用 MariaDB 10.2.21 我没有在其他地方看到过这种确切的情况,因此我请求帮助。

我有一个历史记录表,其中包含对 JIRA 问题中任何字段的每次更改的一条记录:

+----------+---------------+----------+-----------------+---------------------+
| IssueKey | OriginalValue | NewValue |      Field      |     ChangeDate      |
+----------+---------------+----------+-----------------+---------------------+
| HRSK-184 | (NULL)        |        2 | Risk Detection  | 2019-10-24 10:57:27 |
| HRSK-184 | (NULL)        |        2 | Risk Occurrence | 2019-10-24 10:57:27 |
| HRSK-184 | (NULL)        |        2 | Risk Severity   | 2019-10-24 10:57:27 |
| HRSK-184 | 2             |        4 | Risk Detection  | 2019-10-25 11:54:07 |
| HRSK-184 | 2             |        6 | Risk Detection  | 2019-10-25 11:54:07 |
| HRSK-184 | 2             |        3 | Risk Severity   | 2019-10-24 11:54:07 |
| HRSK-184 | 6             |        5 | Risk Detection  | 2019-10-26 09:11:01 |
+----------+---------------+----------+-----------------+---------------------+

每条记录都包含旧值和新值以及已更改的字段类型(“字段”),当然还有该更改的相应时间戳。

我想查询时间点状态,为我提供“风险严重性、风险发生和风险检测”每个字段的最新值组合

结果应该是这样的:

+----------+----------------+-------------------+------------------+----------------------+
| IssueKey | Risk Severity  |  Risk Occurrence  |  Risk Detection  |  ChangeDate          |
+----------+----------------+-------------------+------------------+----------------------+
| HRSK-184 | 3              |  2                |  5               |  2019-10-26 09:11:01 |
+----------+----------------+-------------------+------------------+----------------------+

有什么想法吗?我被困住了... 提前感谢您的努力!

【问题讨论】:

    标签: sql merge pivot mariadb mariadb-10.2


    【解决方案1】:

    你冷使用了几个内联查询

    select 
        IssueKey,
        (
            select t1.NewValue 
            from mytable t1 
            where t1.IssueKey = t.IssueKey and t1.Field = 'Risk Severity'
            order by ChangeDate desc limit 1
        ) `Risk Severity`,
        (
            select t1.NewValue 
            from mytable t1 
            where t1.IssueKey = t.IssueKey and t1.Field = 'Risk Occurrence'
            order by ChangeDate desc limit 1
        ) `Risk Occurrence`,
        (
            select t1.NewValue 
            from mytable t1 
            where t1.IssueKey = t.IssueKey and t1.Field = 'Risk Detection'
            order by ChangeDate desc limit 1
        ) `Risk Severity`,
        max(ChangeDate) ChangeDate
    from mytable t
    group by IssueKey
    

    使用(IssueKey, Field, ChangeDate, NewValue) 上的索引,这应该是一个有效的选择。

    Demo on DB Fiddle

    问题密钥 |风险严重性 |风险发生 |风险严重性 |改变日期 :------- | ------------: | --------------: | ------------: | :----------------- HRSK-184 | 3 | 2 | 5 | 2019-10-26 09:11:01

    【讨论】:

    • 这确实是我想要的。我会再调整一下。谢谢@GMB!
    【解决方案2】:

    MariaDB 10.2 引入了一些 Window Functions 用于分析查询。

    其中一个是RANK() OVER (PARTITION BY ...ORDER BY...) 函数。

    首先,您可以应用它,然后通过Conditional Aggregation 旋转:

    SELECT IssueKey,
           MAX(CASE WHEN Field = 'Risk Severity'   THEN NewValue END ) AS RiskSeverity,
           MAX(CASE WHEN Field = 'Risk Occurrence' THEN NewValue END ) AS RiskOccurrence,
           MAX(CASE WHEN Field = 'Risk Detection'  THEN NewValue END ) AS RiskDetection,
           MAX(ChangeDate) AS ChangeDate
      FROM
      (
       SELECT RANK() OVER (PARTITION BY IssueKey, Field ORDER BY ChangeDate Desc) rnk,
              t.*
         FROM mytable t 
      ) t
      WHERE rnk = 1
      GROUP BY IssueKey;
    
    IssueKey | RiskSeverity  | RiskOccurrence  | RiskDetection  | ChangeDate     
    -------- + --------------+-----------------+----------------+--------------------
    HRSK-184 |             3 |               2 |              5 | 2019-10-26 09:11:01
    

    Demo

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      相关资源
      最近更新 更多