按 IP 排序,然后继续选择记录,直到我有 3 个唯一的 IP



我可能比现在更努力地考虑这个问题。

我的数据库中有一个报告表,其中包含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,接下来按以下方式对它们进行分组,立即对它们进行分组

最新更新