我正在尝试从 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/
我试图获取一个长度在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
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
请帮助我理解范围运算符...和..之间的区别,作为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)是
我知道我可以指定某些字段来使用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
我正在尝试从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
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我使用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
我正在尝试解析一个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
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我想这样组织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中)将被完全忽略。