合并行但维护单独的列

时间:2019-12-18 14:37:20

标签: mysql

我不确定如何将多个表中的数据聚合到一个表中-任何人都可以帮忙吗?

我有大量的“历史数据”表,每个表都有2列:时间戳记(bigint,unix毫秒)和值(双精度)。

我正在尝试从多个表中收集数据,并为每个表每天计算最大值。

到目前为止,我的查询如下:

SELECT DATE(FROM_UNIXTIME(Timestamp/1000)) AS Date, 
CASE WHEN Source = 'Meter 1' THEN MAX(Value) ELSE '' END AS 'Meter 1',
CASE WHEN Source = 'Meter 2' THEN MAX(Value) ELSE '' END AS 'Meter 2',
CASE WHEN Source = 'Meter 3' THEN MAX(Value) ELSE '' END AS 'Meter 3'
FROM 
(
    SELECT  'Meter 1' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 1>
    UNION ALL
    SELECT  'Meter 2' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 2>
    UNION ALL
    SELECT  'Meter 3' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 3>
) AS data
GROUP BY Source, DATE(FROM_UNIXTIME(Timestamp/1000));

如果仅在DATE(FROM_UNIXTIME(Timestamp / 1000))上进行GROUP BY,则只能看到仪表1的结果。通过按Source进行分组,也可以看到所有结果,但是日期不会汇总,例如:

Date        Meter 1     Meter 2     Meter 3
2019-12-11  26       
2019-12-12  27       
2019-12-13  28       
2019-12-14  29       
2019-12-15  30       
2019-12-16  31       
2019-12-17  31       
2019-12-11              18   
2019-12-12              18   
2019-12-13              18   
2019-12-14              22   
2019-12-15              22   
2019-12-16              22   
2019-12-17              22   
2019-12-11                          3747
2019-12-12                          3784
2019-12-13                          3819
2019-12-14                          3847
2019-12-15                          3875
2019-12-16                          3908
2019-12-17                          918

我已经阅读了一些相关问题,但我不知道。我确定我缺少简单的东西。

非常感谢。

2 个答案:

答案 0 :(得分:0)

您尚未提供测试数据,但是让我们尝试一下

SELECT DATE(FROM_UNIXTIME(Timestamp/1000)) AS Date, 
MAX(if(Source = 'Meter 1', Value, 0)) AS 'Meter 1',
MAX(if(Source = 'Meter 2', Value, 0)) AS 'Meter 2',
MAX(if(Source = 'Meter 3', Value, 0)) AS 'Meter 3'
FROM 
(
    SELECT  'Meter 1' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 1>
    UNION ALL
    SELECT  'Meter 2' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 2>
    UNION ALL
    SELECT  'Meter 3' AS Source, TIMESTAMP AS Timestamp, VALUE AS Value
    FROM    <table name 3>
) AS data
GROUP BY DATE(FROM_UNIXTIME(Timestamp/1000));

答案 1 :(得分:0)

@Alexey 非常感谢,您的建议非常有效。似乎使用IF而不是CASE可以解决问题:

Date            Meter 1     Meter 2     Meter 3  
2019-12-11      26          18          3747
2019-12-12      27          18          3784
2019-12-13      28          18          3819
2019-12-14      29          22          3847
2019-12-15      30          22          3875
2019-12-16      31          22          3908
2019-12-17      31          22          3918