mysql - 是否可以在没有两个子查询的情况下进行更短的查询
问题描述
我为我的表构建了一个符合我需要的查询。但我认为这不是进行此查询的最佳方式。我拥有的表格非常简单,它只有两列:
------------------------------------------
| _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。
解决方案
推荐阅读
- concurrency - DDD - 并发和命令重试有副作用
- asp.net - 下拉菜单的 ASP:NET web api 问题
- node.js - 指示在 NodeJS 中通过 Twilio API 接收到 WhatsApp 消息?
- amazon-redshift - Redshift to_date 问题:日期格式无效;指定日期两次
- docusignapi - 只能从一个文件夹中检索 20 个文档
- php - 使用php从json中的嵌套数组中获取数据
- typescript - 打字稿在linux获取模块未找到错误中表现不同
- core-data - 线程 1:“NSFetchedResultsController 的一个实例需要一个带有排序描述符的获取请求”
- terraform - Terraform 中动态入口中的 Rule_nos
- python - 网页抓取到 html 中的特定点然后停止