首页 > 解决方案 > 是否可以在没有两个子查询的情况下进行更短的查询

问题描述

我为我的表构建了一个符合我需要的查询。但我认为这不是进行此查询的最佳方式。我拥有的表格非常简单,它只有两列:

------------------------------------------
|     _dti_stamp      |      _js_dp      | <- Column Name
|---------------------|------------------|
|   TIMESTAMP-FIELD   |    JSON-FIELD    | <- Array
|---------------------|------------------|
| 2019-01-01 12:10:15 |[2351442, 0, ...] | <- Record Example
------------------------------------------
| 2019-01-01 12:15:17 |[2351583, 0, ...] | <- Record Example
------------------------------------------

我的主键是_dti_stamp,因为我只想根据时间戳锁定数据。

我每天都会收到多条新记录。

在这个 JSON-ARRAY 中,条目是计数器,它们只是不时增加的整数,具体取决于某些光伏面板产生了多少能量。

我需要的是获取我想要检查的每一天的第一个和最后一个_dti_stamp 以及它们的相应值,从另一个中减去一个并将结果作为两列_day 和_diff 返回。这使我能够显示每天产生多少能量。

我想出的查询如下所示:

SELECT 
    _max_query._day AS _day,
    (_max_query._data - _min_query._data) AS _diff
FROM
    (SELECT 
        _subquery._day AS _day,
            JSON_EXTRACT(_js_dp, '$[97]') AS _data
    FROM
        (SELECT 
        DATE_FORMAT(_dti_stamp, '%Y-%m-%d') AS _day,
            MIN(_dti_stamp) AS _tmin
    FROM
        TTConnect.CL_2
    WHERE
        _dti_stamp BETWEEN '2019-01-01' AND '2019-01-10'
    GROUP BY _day) AS _subquery, TTConnect.CL_2
    WHERE
        _dti_stamp = _subquery._tmin
    GROUP BY _day) AS _min_query,
    (SELECT 
        _subquery._day AS _day,
            JSON_EXTRACT(_js_dp, '$[97]') AS _data
    FROM
        (SELECT 
        DATE_FORMAT(_dti_stamp, '%Y-%m-%d') AS _day,
            MAX(_dti_stamp) AS _tmax
    FROM
        TTConnect.CL_2
    WHERE
        _dti_stamp BETWEEN '2019-01-01' AND '2019-01-10'
    GROUP BY _day) AS _subquery, TTConnect.CL_2
    WHERE
        _dti_stamp = _subquery._tmax
    GROUP BY _day) AS _max_query
WHERE
    _min_query._day = _max_query._day
GROUP BY _day;

我从此查询获得的输出如下所示:

------------------------------------------
|         _day        |      _diff       | 
|---------------------|------------------|
|      2019-01-01     |    3444023       | 
|---------------------|------------------|
|      2019-01-02     |    3444023       | 
|---------------------|------------------|
|      2019-01-03     |    3444023       | 
|---------------------|------------------|
|      2019-01-04     |    3444023       | 
|---------------------|------------------|
|      2019-01-05     |    3444023       | 
|---------------------|------------------|
|      2019-01-06     |    3444023       | 
|---------------------|------------------|
|      2019-01-07     |    3444023       | 
|---------------------|------------------|
|      2019-01-08     |    3444023       | 
|---------------------|------------------|
|      2019-01-09     |    3444023       | 
|---------------------|------------------|

(这是我生成的Testdateset)所以我的代码做了它应该做的(我简化了一点,因为就像你看到的那样,我想要的最后一天不在响应中,而是使用简单的DATE_ADD( )间隔 1 天我到达我想要的地方)。我猜响应时间也可以,我的测试集约 308000 行,获取上述数据的时间为 0.015 秒。

到目前为止,我还不是使用数据库的专业人士,但即使它适用于这种方法,似乎至少应该有一种更优雅的方式来达到目标​​,或者以这种方式构建查询是否正常?顺便说一句,我使用的是 MySQL 5.7.14。

标签: mysql

解决方案


推荐阅读