【问题标题】:Find datetime overlap with non-datetime based criteria查找与非基于日期时间的标准的日期时间重叠
【发布时间】:2013-02-09 04:23:20
【问题描述】:

我正在尝试根据日期时间值确定行的重叠,但完全不知道如何实现这一点。在阅读了此处和其他网站的回复后,我在高层次上对需要做什么有一个模糊的理解,但不知道从哪里开始。

原始数据集是分隔的,我愿意在 Excel、Access、Python 或 Perl 中执行此操作。

在更大的数据集中(大约 115,000 行)中有三个不同的数据块; Apple、Orange 和 Pear - 示例数据如下。

数据集的图像可以在 -http://i.imgur.com/DQtmuvI.jpg 找到

filename                    network     spot_id         dt_sched                dt_insert

APPLE_2012_10151135.VCA     APPLE       00NC8109450     01/01/2012 0:20:30      01/01/2012 0:23:10
APPLE_2012_10151135.VCA     APPLE       0NF81700041     01/01/2012 0:20:30      01/01/2012 0:22:40
APPLE_2012_10151135.VCA     APPLE       0NF82100170     01/01/2012 0:50:30      01/01/2012 0:48:57
APPLE_2012_10151135.VCA     APPLE       MK882000004     01/01/2012 0:50:30      01/01/2012 0:49:27
ORANGE_2012_10102135.VCA    ORANGE      0NF82100186     01/01/2012 0:15:30      01/01/2012 0:14:27
ORANGE_2012_10102135.VCA    ORANGE      00NC8139709     01/01/2012 0:15:30      01/01/2012 0:14:57
ORANGE_2012_10102135.VCA    ORANGE      0NF82400065     01/01/2012 0:31:30      01/01/2012 0:27:08
ORANGE_2012_10102135.VCA    ORANGE      000NC899740     01/01/2012 0:31:30      01/01/2012 0:27:38
ORANGE_2012_10102135.VCA    ORANGE      0NF81700041     01/01/2012 0:50:30      01/01/2012 0:46:58
ORANGE_2012_10102135.VCA    ORANGE      000NC899740     01/01/2012 0:50:30      01/01/2012 0:47:28
PEAR_2012_10125135.VCA      PEAR        0NF82100169     01/01/2012 0:15:30      01/01/2012 0:21:52
PEAR_2012_10125135.VCA      PEAR        ML817000190     01/01/2012 0:15:30      01/01/2012 0:22:22
PEAR_2012_10125135.VCA      PEAR        0NF82200043     01/01/2012 0:45:30      01/01/2012 0:47:43
PEAR_2012_10125135.VCA      PEAR        ML803000400     01/01/2012 0:45:30      01/01/2012 0:48:13

如果出现以下情况,需要当天确定:

dt_sched 和 dt_insert 之间的重叠

  • 苹果重叠橙色
  • 苹果与梨重叠
  • 橙色与苹果重叠
  • 橙色与梨重叠
  • 梨与苹果重叠
  • 梨重叠橙

表中的每个网络; Apple、Orange、Pear 包含 365 天的交易和一天 24 小时的交易。原始数据集在 Excel 中,我正在导入 Access。

【问题讨论】:

  • 为什么不将该示例数据集复制并粘贴到您的帖子中?屏幕截图对我们重现您的设置几乎没有用处。
  • 您需要edit您的问题才能添加该信息。
  • “重叠”是指以下内容: (1) 在每一行中,dt_sched 定义时间间隔的开始,dt_insert 定义时间间隔的结束; (2) 如果网络A 的任何时间间隔与网络B 的任何时间间隔重叠,则两个网络AB 在给定日期“重叠”?这意味着如果 A 与 B 重叠,则根据定义 B 与 A 重叠。
  • 是的,吉姆。此外,我只关心网络 A、B 或 C 之间一天(24 小时)的重叠。
  • 在样本数据中,一个时间间隔的开始在比结束晚的地方;这应该是固定的。

标签: sql ms-access overlap


【解决方案1】:

没有一种特别有效的方法可以做到这一点。下面给出SQL解决方案:

select cdate(int(t1.dt_sched)) as thedate, t1.network, t2.network, count(*) as numoverlaps
from t t1 join
     t t2
     on int(t1.dt_sched) = int(t2.dt_sched) and
        t1.dt_sched <= t2.dt_insert and
        t2.dt_sched <= t1.dt_insert
group by cdate(int(t1.dt_sched)), t1.network, t2.network

注意:我没有测试过这个查询,所以它可能有语法错误。

这将确定任意两个网络之间的重叠。如果您不关心同一网络上的重叠,请包括where t1.network &lt;&gt; t2.network。如果有列出的网络以外的其他网络,则包括 `where t1.network in (NETWORK LIST HERE) 和 t2.network in (NETWORK LIST HERE)。

【讨论】:

  • 谢谢你,戈登。作为 SQL 新手,我假设根据您的查询,您希望网络位于单独的表中,对吗?如果所有记录都在一个表中怎么办?
  • 这假设所有记录都在一个表中,它们在问题中的描述方式。如果它们在不同的表中,它不会简化 SQL。
  • Gordon,我认为 't' 是您示例中我的表的名称。我试图在 Access 中运行查询并得到一个“FROM 子句中的语法错误”消息运行执行。 select cdate(int(t1.dt_sched)) as thedate, t1.network, t2.network, count(*) as numoverlapsfrom small t1 join small t2 on int(t1.dt_sched) = int(t2.dt_sched) and t1.dt_sched &lt;= t2.dt_insert and t2.dt_sched &lt;= t1.dt_insert where t1.network &lt;&gt; t2.network group by cdate(int(t1.dt_sched)), t1.network, t2.network
  • 上面注释中的代码在numoverlapsfrom中缺少空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多