SQL 查询介于其他值之间的计数 Table

SQL Query of Counts That Lie Between Values in Other Table

我不确定如何用标题来表达。我有一个我无法弄清楚的查询:

我有一个 table 'values' 带有时间戳(十进制 1970 纪元)和每行一个 blob。我有一个名为 'keys' 的第二个 table,它包含一个时间戳和密钥,用于解密第一个 table 'values' 中的每个 blob。密钥以随机间隔定期更改,每次密钥更改时,都会将一组新密钥写入 'keys' table。有多个密钥,当一个新的密钥集写入 'keys' table 时,每个密钥都有一个具有相同时间戳的单独条目。

如果我这样做:

select distinct timestamp from keys;

每次密钥轮换时我都会返回一个集合,并将新的密钥集写入数据库。

我想要的是 mysql 中的 sql 语句,即每个键集的 returns 时间戳和 'values' [=48= 中的记录总数] 在每个关键时间戳之间。

例如:

Timestamp Count
1635962134 23
1636048054 450
1636145254 701

等...

最后一行需要特别考虑,因为它的“当前”集合在键中没有其他条目table(还..)

SQL Fiddle 示例数据: SQL FIDDLE WITH SAMPLE DATA

对于上面的示例数据,结果应该是: |时间戳 |计数 | | ---------- | ----- | | 1635962134 | 14| | 1636043734 | 28| | 1636119328 | 11|

您受到 mySQL 版本的一些限制,但您可以使用变量来帮助创建行集。您也可以使用联接来完成,但会稍微复杂一些。

https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=b5d587b30f1a758ce31e3fa4745f26d0

SELECT k.key1, k.key2, count(*) as vol
FROM my_values v
JOIN (
  SELECT key_ts as key1, @curr-1 as key2, @curr:= key_ts
  FROM (
    SELECT DISTINCT key_ts FROM my_keys 
    JOIN (SELECT @curr:=9999999999) var
    ORDER BY key_ts DESC
  ) z
) k ON (v.val_ts BETWEEN k.key1 and k.key2)
GROUP BY key1, key2

首先(最里面的子查询)select 来自 my_keys 的不同时间戳并对它们进行排序。我使用该连接只是为了设置变量。您也可以在单独的查询中使用 SET 语句。我将变量设置为任意高的时间戳,这样系列中的最后一个时间戳将始终有一个伙伴。

Select 从那个键和变量值减1(防止重叠),然后把变量设置为当前键。这必须在 select 查询中的所有其他内容之后完成。这将生成两个代表时间范围的成对时间戳。

然后只需将 my_values 连接到这些键,并使用 BETWEEN 作为连接条件。

让我知道这是否适合你。