繁体   English   中英

根据不同的值查询多个MySQL表,并返回第一条和最后一条记录之间的匹配次数和时间差

[英]Querying multiple MySQL tables based on distinct values, and return the matches count and time difference between first and last record

问题总结

我需要选择表中列slug所有不同值,然后遍历其他多个表,并为每次计数出现slug的记录,并找出第一次和最后一次出现之间的天数差异。


示例数据

假设一个表包含对项目的引用,以及包含这些项目中的每一个的定时记录的附加表。 让我们以设备为例,结合不同时间的 CPU、RAM 和 GPU 使用指标记录,基于每个设备。

+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| Table `devices`           | Table `cpu`                 | Table `ram`                 | Table `gpu`                     |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| slug (varchar, prim. key) | slug (varchar, prim. key)   | slug (varchar, prim. key)   | slug (varchar, prim. key)       |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| created (timestamp)       | time (timestamp, prim. key) | date (timestamp, prim. key) | log_time (timestamp, prim. key) |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| 30d_users (int)           | cpu_use (float)             | ram_use (float)             | gpu_use (float)                 |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+
| 7d_users                  |                             |                             |                                 |
+---------------------------+-----------------------------+-----------------------------+---------------------------------+

为了这个例子,让我们在这些上填充一些值:

+---------+---------------------+-----------+----------+
| slug    | created             | 30d_users | 7d_users |
+---------+---------------------+-----------+----------+
| desktop | 2021-02-18 05:10:04 | 1982      | 713      |
+---------+---------------------+-----------+----------+
| laptop  | 2021-02-16 05:10:04 | 1783      | 449      |
+---------+---------------------+-----------+----------+
| tablet  | 2021-02-19 05:10:04 | 119       | 8        |
+---------+---------------------+-----------+----------+
| phone   | 2021-02-27 05:10:04 | 2263      | 1567     |
+---------+---------------------+-----------+----------+
+-----------------------------------------+---+-----------------------------------------+---+-----------------------------------------+
|                CPU Table                | • |                RAM Table                | • |                GPU Table                |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| slug    | time                | cpu_use | • | slug    | date                | ram_use | • | slug    | log_time            | gpu_use |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet  | 2021-03-14 05:10:06 | 72      | • | desktop | 2021-03-14 05:10:06 | 57      | • | phone   | 2021-03-14 05:10:06 | 64      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone   | 2021-03-14 05:10:07 | 33      | • | laptop  | 2021-03-14 05:10:07 | 84      | • | desktop | 2021-03-14 05:10:07 | 48      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-15 05:10:04 | 93      | • | tablet  | 2021-03-14 05:10:04 | 31      | • | laptop  | 2021-03-15 05:10:04 | 51      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-16 05:10:05 | 31      | • | phone   | 2021-03-14 05:10:05 | 64      | • | desktop | 2021-03-15 05:10:05 | 29      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet  | 2021-03-16 05:10:05 | 47      | • | desktop | 2021-03-16 05:10:05 | 90      | • | phone   | 2021-03-15 05:10:05 | 82      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone   | 2021-03-16 05:10:06 | 37      | • | tablet  | 2021-03-16 05:10:06 | 84      | • | phone   | 2021-03-16 05:10:06 | 71      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-16 05:10:07 | 28      | • | laptop  | 2021-03-16 05:10:07 | 98      | • | laptop  | 2021-03-16 05:10:07 | 76      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone   | 2021-03-17 05:10:06 | 94      | • | desktop | 2021-03-17 05:10:06 | 28      | • | phone   | 2021-03-17 05:10:06 | 79      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-17 05:10:07 | 87      | • | phone   | 2021-03-17 05:10:07 | 17      | • | desktop | 2021-03-17 05:10:07 | 34      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet  | 2021-03-17 05:10:08 | 93      | • | tablet  | 2021-03-17 05:10:08 | 67      | • | tablet  | 2021-03-17 05:10:08 | 38      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-17 05:10:09 | 54      | • | laptop  | 2021-03-17 05:10:09 | 96      | • | laptop  | 2021-03-17 05:10:09 | 95      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-18 05:10:07 | 21      | • | tablet  | 2021-03-18 05:10:07 | 50      | • | tablet  | 2021-03-18 05:10:07 | 32      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-18 05:10:08 | 17      | • | laptop  | 2021-03-18 05:10:08 | 30      | • | laptop  | 2021-03-18 05:10:08 | 27      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet  | 2021-03-19 05:10:08 | 42      | • | tablet  | 2021-03-19 05:10:08 | 79      | • | tablet  | 2021-03-19 05:10:08 | 26      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone   | 2021-03-19 05:10:09 | 30      | • | phone   | 2021-03-19 05:10:09 | 80      | • | tablet  | 2021-03-19 05:10:09 | 64      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-19 05:10:10 | 81      | • | desktop | 2021-03-19 05:10:10 | 60      | • | desktop | 2021-03-19 05:10:10 | 91      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-19 05:10:11 | 63      | • | laptop  | 2021-03-19 05:10:11 | 71      | • | laptop  | 2021-03-19 05:10:11 | 67      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| laptop  | 2021-03-20 05:10:09 | 93      | • | laptop  | 2021-03-20 05:10:09 | 95      | • | laptop  | 2021-03-20 05:10:09 | 95      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-20 05:10:10 | 76      | • | phone   | 2021-03-20 05:10:10 | 40      | • | phone   | 2021-03-20 05:10:10 | 37      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| tablet  | 2021-03-20 05:10:11 | 87      | • | tablet  | 2021-03-20 05:10:11 | 61      | • | tablet  | 2021-03-20 05:10:11 | 69      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-21 05:10:10 | 92      | • | desktop | 2021-03-21 05:10:10 | 45      | • | desktop | 2021-03-21 05:10:10 | 80      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| phone   | 2021-03-22 05:10:11 | 67      | • | phone   | 2021-03-22 05:10:11 | 54      | • | phone   | 2021-03-24 05:10:11 | 48      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+
| desktop | 2021-03-22 05:10:12 | 47      | • | laptop  | 2021-03-26 05:10:12 | 90      | • | tablet  | 2021-03-29 05:10:12 | 22      |
+---------+---------------------+---------+---+---------+---------------------+---------+---+---------+---------------------+---------+

期望的结果

现在,假设我想运行一个通过以下方式获取摘要的查询:

  1. 获取devices表中的每个slug
  2. 检查每个slug的每个cpuramgpu上的记录数
  3. 获取这些表中的第一条和最后一条匹配记录(分别按time / datelog_time
  4. 计算第一条记录和最后一条记录之间的天数差
  5. 返回结果的结构为slug - table_name_diff - table_name_count (乘以查询的表数,上例为3)

例如,以上面的示例数据为例,结果将是:

+---------+-----------+----------+-----------+----------+-----------+----------+
| slug    | cpu_count | cpu_diff | ram_count | ram_diff | gpu_count | gpu_diff |
+---------+-----------+----------+-----------+----------+-----------+----------+
| desktop | 7         | 6        | 5         | 7        | 5         | 7        |
+---------+-----------+----------+-----------+----------+-----------+----------+
| laptop  | 6         | 5        | 7         | 10       | 6         | 5        |
+---------+-----------+----------+-----------+----------+-----------+----------+
| tablet  | 5         | 6        | 6         | 6        | 6         | 12       |
+---------+-----------+----------+-----------+----------+-----------+----------+
| phone   | 5         | 8        | 5         | 8        | 6         | 10       |
+---------+-----------+----------+-----------+----------+-----------+----------+

通过查询,我设法仅针对单个表实现了这一点(但不适用于多个表,并且没有从devices表中获取slug值):

SELECT DISTINCT slug, DATEDIFF(MAX(time), MIN(time)) as cpu_diff, COUNT(*) 
FROM cpu 
GROUP BY slug 
ORDER BY `cpu_diff` DESC

你在正确的轨道上!

考虑从您现有的方法构建:

WITH cpu_summary AS (
  SELECT slug
       , DateDiff(dd, Max(time), Min(time) AS cpu_diff
       , Count(*) AS cpu_count
  FROM   cpu
  GROUP
      BY slug
)
, ram_summary AS (
  <a very similar looking query to the above one, but on the ram table>
)
, gpu_summary AS (
  <take a guess ;-)>
)
SELECT devices.slug
     , cpu_summary.cpu_diff
     , cpu_summary.cpu_count
     , ram_summary.ram_diff
     , ram_summary.ram_count
     , gpu_summary.gpu_diff
     , gpu_summary.gpu_count
FROM   devices
 LEFT
  JOIN cpu_summary
    ON cpu_summary.slug = devices.slug
 LEFT
  JOIN ram_summary
    ON ram_summary.slug = devices.slug
 LEFT
  JOIN gpu_summary
    ON gpu_summary.slug = devices.slug
;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM