我可能比现在更努力地考虑这个问题。
我的数据库中有一个报告表,其中包含IP列(varchar(,数据列(INT(和时间戳列(TIMESTAMP(。
我必须编写一个查询,其中我按时间戳 DESC 排序,然后基本上继续从顶部选择记录,直到我的结果集包含至少 3 个唯一 IP,按出现顺序排列,直到遇到第 4 个 IP。
例如:
IP Data Timestamp
1.1.1.0 0 1-1-2016
1.1.1.1 1 1-2-2016
1.1.1.1 2 1-3-2016
1.1.1.2 1 1-4-2016
1.1.1.3 1 1-5-2016
1.1.1.3 1 1-6-2016
在这种情况下,我想要一个结果集:
IP Data Timestamp
1.1.1.3 1 1-6-2016
1.1.1.3 1 1-5-2016
1.1.1.2 1 1-4-2016
1.1.1.1 2 1-3-2016
1.1.1.1 1 1-2-2016
仅针对用例:使用此数据的后端将对 IP 进行分组,生成数据列的平均值(基本上将 1+ IP 展平为 1(,然后再进一步处理。
我尝试弄乱分组依据,拥有,子查询,我只是想不通,因为它看起来如此微不足道!
编辑:一些额外的信息
SELECT DISTINCT ip
FROM report
ORDER BY timestamp DESC
LIMIT 3
不尊重 IP 的第一次出现。例如,如果1.1.1.3
在表中作为最后一次和第四次出现,则 DISTINCT 会将应该排在顶部的 IP 作为第四个(意味着它被排除在限制 3 之外(。
然后我尝试:
SELECT *
FROM report
WHERE ip in (
SELECT DISTINCT ip
FROM report
ORDER BY timestamp DESC
)
ORDER BY timestamp DESC
LIMIT 3
这似乎有效,但也高度未优化...LIMIT 在 IN 中不起作用,MySQL 拒绝这样做。当我使用 LIMIT 时,概述的问题就会发生。
如果我正确理解您的问题,则类似于以下查询的内容应该有效:
SELECT *
FROM report
WHERE Timestamp >= (
SELECT MIN(Timestamp) FROM (
SELECT IP, MIN(Timestamp) as Timestamp
FROM report
GROUP BY IP
ORDER BY Timestamp DESC
LIMIT 3
) x
)
ORDER BY Timestamp DESC
可能有办法优化此查询,但我不知道您的方案是否需要这样做。
请参阅此 SQL 小提琴以在实践中对其进行测试。
怎么样
SELECT AVG(data), ip
GROUP BY ip
ORDER BY timestamp DESC
LIMIT 0,3
我的意思是也将下一个任务执行到查询中。 为什么要列出 X 个不同的 IP,接下来按以下方式对它们进行分组,立即对它们进行分组