草庐IT

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

coder 2023-10-10 原文

我可能比以前更认真地思考了这个问题。

我的数据库中有一个报告表,其中有一个 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),然后再进一步处理。

我尝试搞乱 GROUP BY、HAVING、子查询,但我只是想不通,因为它看起来很微不足道!

编辑:一些额外信息

SELECT DISTINCT ip
FROM report
ORDER BY timestamp DESC
LIMIT 3

不尊重 IP 的第一次出现。例如,如果 1.1.1.3 在表中作为最后一次出现和第四次出现,那么 DISTINCT 会将应该排在最前面的 IP 作为第四次出现(意味着它被排除在 LIMIT 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

可能有优化此查询的方法,但我不知道您的场景是否需要这样做。

参见 this SQL Fiddle在实践中对其进行测试。

关于mysql - 按 IP 排序然后继续选择记录,直到我有 3 个唯一的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242475/

有关mysql - 按 IP 排序然后继续选择记录,直到我有 3 个唯一的 IP的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  3. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  4. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  6. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  7. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  8. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  9. ruby - 继续,未定义 callcc 方法 - 2

    我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐