java - 如何确保 ResultSet 包含 "missing"观察的行

标签 java mysql sql jdbc resultset

我有一个如下所示的结果集表:

+------------+--------------------+--------------------+---------+-----------------------+
| test_date  | upload_kbps        | download_kbps      | latency | network_operator_name |
+------------+--------------------+--------------------+---------+-----------------------+
| 2017-04-02 |  19.12741903076923 | 44.614721153846155 | 32.1250 | Alcatel               |           
| 2017-03-31 |  18.30683616557377 | 44.294387978142076 | 34.7432 | Alcatel               |
| 2017-03-31 | 20.643555595555555 |  50.99801587301587 | 32.1640 | Vodafone              |

我想修改 ResultSet 以供进一步使用,同时我将一行添加到 ResultSet 中,如下所示:

    +------------+--------------------+--------------------+---------+-----------------------+
    | test_date  | upload_kbps        | download_kbps      | latency | network_operator_name |
    +------------+--------------------+--------------------+---------+-----------------------+
    | 2017-04-02 |  19.12741903076923 | 44.614721153846155 | 32.1250 | Alcatel               |   
    | 2017-04-02 |  0                 | 0                  | 0       | Vodafone              |        
    | 2017-03-31 |  18.30683616557377 | 44.294387978142076 | 34.7432 | Alcatel               |
    | 2017-03-31 | 20.643555595555555 |  50.99801587301587 | 32.1640 | Vodafone              |

这背后的逻辑基本上是为当天未进行速度测试的电信添加一个空行。为了进一步说明:我需要这样做的原因是因为 MySQL 数据库中的表没有记录未完成测试的行/条目,因此我的原始结果集中缺少一行,因此我需要添加一个 ' NULL/0' 行以反射(reflect)当天该电信公司缺少测试。我目前无法直接访问该数据库来修改条目,所以这是我能想到的最好的办法。

知道我该怎么做吗?感谢您的帮助!

最佳答案

听起来您想在事后向 ResultSet 添加行。 AFAIK,我们不能那样做。相反,我们需要构造我们的 SQL 查询,以便它会生成我们需要的“额外”行。

所以如果我们有一个名为“test”的表

SELECT * FROM test
ORDER BY test_date DESC, network_operator_name

产生

test_date   upload_kbps       download_kbps     latency  network_operator_name
----------  ----------------  ----------------  -------  ---------------------
2017-04-02  19.1274190307692  44.6147211538461   32.125  Alcatel              
2017-03-31  18.3068361655737   44.294387978142  34.7432  Alcatel              
2017-03-31  20.6435555955555  50.9980158730158   32.164  Vodafone             

然后我们可以从查询开始,为 test_datenetwork_operator_name 的每个组合生成一行

SELECT test_date, network_operator_name
FROM
    (SELECT DISTINCT network_operator_name FROM test) unique_operators
    CROSS JOIN
    (SELECT DISTINCT test_date FROM test) unique_dates

这给了我们

test_date   network_operator_name
----------  ---------------------
2017-03-31  Alcatel              
2017-03-31  Vodafone             
2017-04-02  Alcatel              
2017-04-02  Vodafone             

然后我们可以 LEFT JOIN 该查询与实际表

SELECT 
    required_rows.test_date,
    COALESCE(test.upload_kbps, 0) AS upload_kbps,
    COALESCE(test.download_kbps, 0) AS download_kbps,
    COALESCE(test.latency, 0) AS latency,
    required_rows.network_operator_name
FROM 
    (
        SELECT test_date, network_operator_name
        FROM
            (SELECT DISTINCT network_operator_name FROM test) unique_operators
            CROSS JOIN
            (SELECT DISTINCT test_date FROM test) unique_dates
    ) required_rows
    LEFT JOIN
    test
        ON required_rows.test_date = test.test_date 
            AND required_rows.network_operator_name = test.network_operator_name
ORDER BY required_rows.test_date DESC, required_rows.network_operator_name

生产

test_date   upload_kbps       download_kbps     latency  network_operator_name
----------  ----------------  ----------------  -------  ---------------------
2017-04-02  19.1274190307692  44.6147211538461   32.125  Alcatel              
2017-04-02                 0                 0        0  Vodafone             
2017-03-31  18.3068361655737   44.294387978142  34.7432  Alcatel              
2017-03-31  20.6435555955555  50.9980158730158   32.164  Vodafone             

关于java - 如何确保 ResultSet 包含 "missing"观察的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47129396/

相关文章:

php - 三个表和 belongsTo() 函数的 Laravel Eloquent 关系映射问题

mysql 将查询保存到另一个表

php - 带 child 怎么办?

SQL - 选择其子行的列包含特定字符串的行

java - 无法打开类路径资源[org/quartz/impl/jdbcjobstore/tables_h2.sql],因为它不存在

java - 引用的 Integer 对象未递增

java - 从映射表中获取一个查询中的数据

PHP/mySQL 计算每个国家代码的总评论数

java - 在 JAX-RS 中调用自定义 ExceptionMapper

java - 如何在POM文件中指定maven命令行选项?