MySQL将行值合并为单行

时间:2011-11-30 11:22:51

标签: mysql sql merge greatest-n-per-group

我需要为表创建一个select查询,该表将“Number”列中的每个行的行合并,以获得包含所有可用的最新(By ID)列的单行。

这就是我的意思,我需要拿一张这样的表:

ID | Number |   Date 1   |   Date 2   |   Date 3   |
----------------------------------------------------
1  |   1    | 2011-10-01 |    NULL    |    NULL    |
2  |   1    |    NULL    | 2011-10-25 |    NULL    |
3  |   1    |    NULL    |    NULL    | 2011-11-13 |
4  |   1    | 2011-10-03 |    NULL    | 2011-11-10 |
5  |   2    |    NULL    |    NULL    | 2012-01-01 |
6  |   2    | 2012-03-11 |    NULL    |    NULL    |

并返回此信息(ID列与上述ID列无关):

ID | Number |   Date 1   |   Date 2   |   Date 3   |
----------------------------------------------------
1  |    1   | 2011-10-03 | 2011-10-25 | 2011-11-10 |
2  |    2   | 2012-03-11 |    NULL    | 2012-01-01 |

因此对于每个组中的所有行按“数字”列,我需要组中所有行的所有可用列值,但只需要每列的最新值。最新值由“ID”的最高值确定,其中列中的值存在。 (如果组中的任何行上没有列中的值,则使用Null值。)

由于

3 个答案:

答案 0 :(得分:1)

您可以使用子查询来选择不同的数字。然后,对于每个数字,您可以在另一个子查询中查找各个列。子查询将查找具有最高ID的行,其中该特定列不为空。

select  yt.Number
,       (
        select  top 1 [Date 1]
        from    YourTable d1
        where   d1.Number = yt.Number
                and d1.[Date 1] is not null
        order by
                d1.ID desc
        ) as [Date 1]
,       (
        select  top 1 [Date 2]
        from    YourTable d2
        where   d2.Number = yt.Number
                and d2.[Date 2] is not null
        order by
                d1.ID desc
        ) as [Date 2]
,       ...
from    (
        select  distinct Number
        from    YourTable
        ) as yt

答案 1 :(得分:1)

感谢大家的建议。不幸的是,我无法让任何当前的答案对我有用。 不幸的是,我不能依赖日期使用聚合函数,因为它们可能不是最大值或最小值。 每个日期列使用子查询非常聪明,但我无法使查询运行得足够快以供我使用。 (它需要几乎立即运行,但尽管正确配置了索引,但却是在花费大量的时间。)

我提出的解决方案是创建一个具有结构的新表来保存结果,然后使用多个触发器使该表保持最新。有问题的实际表会定期更新,并且表中的插入应该允许我使用触发器保持单独的表更新,从而为我提供我需要的内容。

答案 2 :(得分:0)

这会深化您的数据,您也可以使用聚合函数。*

如果您的数据在其他行中始终具有空值,则聚合函数将忽略它们。这意味着您可以使用GROUP BY获取单行。

SELECT ID, Number, MAX(Date1), MAX(Date2), MAX(Date3)
FROM MyTable
GROUP BY ID, Number

* 注意:这只有在您知道您始终需要MAX(或MIN)值的情况下才有效。在您的问题中,您声明您想要具有最高ID的那个,因此我的解决方案可能无效。