我真的在为这个查询而苦苦挣扎。任何帮助将不胜感激!
表格:
+------+----------+--------------------+--------+-------------------+
|Ref |Dept |DeptTime |Arr |ArrTime |
+------+----------+--------------------+--------+-------------------+
|1 |New York |2015-02-01 08:00:00 |Boston |2015-02-01 09:00:00|
|1 |Boston |2015-02-01 10:00:00 |Chicago |2015-02-01 11:00:00|
|1 |Chicago |2015-02-01 12:00:00 |Dallas |2015-02-01 13:00:00|
|1 |Dallas |2015-02-02 11:00:00 |Seattle |2015-02-02 13:00:00|
|2 |London |2015-02-01 04:00:00 |Berlin |2015-02-01 16:00:00|
|2 |Berlin |2015-02-02 18:00:00 |Moscow |2015-02-02 23:00:00|
+------+----------+--------------------+--------+-------------------+
此表显示多站旅程。如果到达和离开之间的停留时间少于 4 小时,则应视为同一行程的一部分。目的地应为下一次出发时间大于四小时的首次到达时间。在那种情况下,我想显示出发城市和出发时间,以及最终到达目的地和到达时间。您可以在此问题的底部看到所需的输出示例。
我认为查询应该做的是选择具有相同 ref 的值(使用连接?),仅比较不同行的 ArrTime 和 DeptTime,如果差异大于 4 小时,则返回 Dept、DeptTime、多站旅程的 Arr 和 ArrTime。任何超过 4 小时的时间都被视为该旅程的结束。
我已经尝试使用几个简单的查询,但是我不知道如何计算具有相同 Ref 的不同项目之间的 Datetime 差异,以及如何比较不同行之间的 ArrTime 和 DeptTime。
我在 StackOverflow 上发现了这种比较日期时间的方法,但是我在使用它时得到的只是一个语法错误..
DECLARE @date1 DATETIME;
DECLARE @date2 DATETIME;
SET @date1 = '2012-04-01 08:10:16';
SET @date2 = '2012-04-10 11:35:36';
编辑:查询后的最终输出表应该是这样的:
+------+----------+--------------------+--------+-------------------+
|Ref |Dept |DeptTime |Arr |ArrTime |
+------+----------+--------------------+--------+-------------------+
|1 |New York |2015-02-01 08:00:00 |Dallas |2015-02-01 13:00:00|
|1 |Dallas |2015-02-02 11:00:00 |Seattle |2015-02-02 13:00:00|
|2 |London |2015-02-01 04:00:00 |Berlin |2015-02-01 16:00:00|
|2 |Berlin |2015-02-02 18:00:00 |Moscow |2015-02-02 23:00:00|
+------+----------+--------------------+--------+-------------------+
如有任何帮助,我们将不胜感激!
最佳答案
我会通过创建两个用于报告目的的中间表来做到这一点。
第一个称为 flight_journey。它根据您的时间要求将每个航类所在的航类分组。
第二个称为 first_last。它标识每个旅程中的第一个和最后一个航类,因为这就是您想要显示的全部内容。
最后的 select 语句仅使用 first_last 表和自连接来显示您想要的内容。
您可以索引中间表以提高性能。
FLIGHT_JOURNEY 表:
create table flight_journey as
select z.*, @row_num := if(@prev_value=chk,@row_num+1,1) as journey
from(
select
f.*, p.arrtime as prev_arr,
case
when p.depttime is null then 1
when ifnull(hour(timediff(f.depttime, p.arrtime)), 0) <= 4 then
1
else
0
end as chk
from
flights f
left join flights p on f.ref = p.ref
and p.depttime = (select max(z.depttime) from flights z where z.ref = p.ref and z.depttime < f.depttime)
) z,
(select @row_num := 1) x,
(select @prev_value := '') y
order by
z.ref,
z.depttime;
FIRST_LAST 表:
create table first_last as
select
y.*
from
(select ref, journey, min(depttime) as min_dept, max(arrtime) as max_arr from flight_journey group by ref, journey) x
join flight_journey y on x.ref = y.ref
and x.journey = y.journey
and (x.min_dept = y.depttime or x.max_arr = y.arrtime);
最终选择语句:
select
x.ref,
x.dept,
x.depttime,
y.arr,
y.arrtime
from
first_last x
join first_last y on x.ref = y.ref
and x.journey = y.journey
and y.depttime > x.depttime
union all
select
x.ref,
x.dept,
x.depttime,
x.arr,
x.arrtime
from
first_last x
join (select ref, journey from first_last group by ref, journey having count(*) = 1) y on x.ref = y.ref
and x.journey = y.journey;
fiddle : http://sqlfiddle.com/#!2/f22b9/2/0
输出:
| REF | DEPT | DEPTTIME | ARR | ARRTIME |
|-----|----------|---------------------------------|---------|---------------------------------|
| 1 | New York | February, 01 2015 08:00:00+0000 | Dallas | February, 01 2015 13:00:00+0000 |
| 1 | Dallas | February, 02 2015 11:00:00+0000 | Seattle | February, 02 2015 13:00:00+0000 |
| 2 | London | February, 01 2015 04:00:00+0000 | Berlin | February, 01 2015 16:00:00+0000 |
| 2 | Berlin | February, 02 2015 18:00:00+0000 | Moscow | February, 02 2015 23:00:00+0000 |
关于mysql - 比较具有相同 ID 的行的日期时间,只返回日期时间差小于 4 小时的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388826/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个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
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998