草庐IT

mysql - 搜索连续范围的数字,同时忽略 <= 5 的间隙

coder 2023-10-25 原文

我正在尝试从 MySQL 的数据集中查找连续范围的数值。但是,应忽略小于 5 的范围内的“间隙”。下面是我当前的代码(在某种程度上可以正常工作),为了方便起见,分割成较小的部分。

dataset 包含“时间”和“数字”列(均为数字)。最终目标是获取与 number > 200 关联的所有“thetime”范围。

(1) 首先,我通过选择编号 <= 200="">

drop temporary table if exists tmp_gaps;
create temporary table tmp_gaps as 
    (select thetime
    from `dataset` 
    where number <= 200);

(2) 根据 here 解释的方法,我将这些发现的差距划分为范围。

drop temporary table if exists tmp_gaps_withdelta;
create temporary table tmp_gaps_withdelta as
    (select min(thetime) as start, max(thetime) as theend, max(thetime) - min(thetime) + 1 as delta
        from (select thetime, @curRow := @curRow + 1 as row_number
            from tmp_gaps v
                join (select @curRow := 0) w) v
        group by thetime - row_number);

(3) 现在,我尝试通过将原始 dataset 表与 tmp_gaps_withdelta 合并来过滤 <= 5="" 的间隙。如果="" delta=""><= 5="" 或="" delta="" 为="" null(意味着="">tmp_gaps_withdelta 中没有对应于 dataset 中原始“thetime”的条目),我认为“thetime”是范围,它在 db_tmp_ranges 中被接受。

drop temporary table if exists db_tmp_ranges;
create temporary table db_tmp_ranges as 
    (select 
        case
            when gaps.delta is null 
                or gaps.delta <= 5 then edm.thetime
            else null
        end as thetime
    from `dataset` edm
        left join tmp_gaps_withdelta gaps on edm.thetime >= gaps.start
            and edm.thetime < gaps.start + gaps.delta);

到目前为止,一切都按预期进行。我现在有一大组“时间”值,其中原始表中的“数字”> 200。数据可以分成范围,没有间隙 <= 5。当我从="">db_tmp_ranges 中选择一些数据时>,我得到了我所期待的。

(4) 现在打算分区,同(2)一样。

select *
from
    (select min(thetime) as start, max(thetime) as theend, max(thetime) - min(thetime) + 1 as delta
    from (select thetime, @curRow := @curRow + 1 as row_number
        from db_tmp_ranges p
            join (select @curRow := 0) r
        where thetime is not null) p
    group by thetime - row_number) q

但是,这个查询的结果是绝对错误的。老实说,我不知道问题出在哪里,因为这种间隔分区的方式一直对我有用,直到现在。非常感谢任何帮助。

编辑:查询如何 react 的具体示例: db_tmp_ranges:

...
1393001313
1393001315
1393001316
...
1393001596
1393001597
1393001598
...

上次查询的结果:

...
1393001316  1393001319  4
1393001320  1393001591  272
1393001592  1393001595  4
1393001596  1393001881  286
...

如您所见,这些数字应该在 1 个区间内,而不是 4+。使用 SQL fiddle 后,查询本身似乎没有问题。

我真的不明白。执行时...

select * 
from db_tmp_ranges 
where thetime >= 1393001313 
and thetime <= 1393001350 
order by thetime;

...我得到一个看起来很正常的数字“时间”值列表。但不知何故,最后一个查询没有按应有的方式使用 db_tmp_ranges。

最佳答案

MySQL 中最简单的方法是使用变量(在其他数据库中,您可以使用窗口/分析函数)。以下代码根据您的规则将 grp 列分配给数字:

select ds.*,
       @grp := iff(@lastnumber - number <= 5, @grp, @grp + 1) as grp,
       @lastnumber := number
from dataset ds cross join
     (select @lastnumber := -1, @grp := 0) const
order by number;

获取实际序列:

select min(number), max(number), max(number) - min(number) as width,
       count(distinct number) as numNumbers
from (select ds.*,
             @grp := iff(@lastnumber - number <= 5, @grp, @grp + 1) as grp,
             @lastnumber := number
      from dataset ds cross join
           (select @lastnumber := -1, @grp := 0) const
      order by number 
     ) ds
group by grp;

关于mysql - 搜索连续范围的数字,同时忽略 <= 5 的间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250784/

有关mysql - 搜索连续范围的数字,同时忽略 <= 5 的间隙的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  7. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  8. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

随机推荐