【问题标题】:Joining a discrete event to a continuous time series using SQL使用 SQL 将离散事件连接到连续时间序列
【发布时间】:2014-03-09 15:42:01
【问题描述】:

我有一个离散的时间事件,我试图加入一个连续的日历。

例如,假设我有一个日期日历,如下所示:

日期
2014 年 1 月 1 日
2014 年 1 月 2 日
2014 年 1 月 3 日 ...
2014 年 12 月 31 日

现在假设您有一个离散事件,例如销售,您想在日历中标记。在此示例中,销售时间为 3 月 3 日至 3 月 7 日。

因此输出如下所示:

日期、销售标志
...
2014 年 3 月 2 日,错误
2014 年 3 月 3 日,是的
2014 年 3 月 4 日,是的
...
2014 年 3 月 7 日,是的
2014 年 3 月 8 日,错误

... 甚至能够只返回销售中的行将是一个开始,即:

日期
2014 年 3 月 3 日
2014 年 3 月 4 日
...
2014 年 3 月 7 日

到目前为止,我认为我需要在 SQL 中使用右外连接来实现这一点。但是,我不确定如何加入一系列值。这是我到目前为止所拥有的:

(注意,由于公司政策规定我们可以使用哪些数据库,因此使用 Access。)

SELECT Sales_Flag
FROM Sales
RIGHT JOIN Calendar
ON Sales.Date = Calendar.[Start Date]
WHERE Calendar.Date BETWEEN Sales.[Start Date] and Sales.[End Date];

但是,我迄今为止的所有尝试都导致我只有开始日期的一行,我完全理解 - 最终我加入了一个值,因此得到一个单行。

因此,我是在朝着正确的方向前进,还是在完全错误的灌木丛中吠叫?

【问题讨论】:

    标签: sql date ms-access time-series


    【解决方案1】:

    不错的主意...但我不明白您为什么只在开始日期加入表。为什么不在日期范围内加入?

    SELECT Sales_Flag
    FROM Sales
    RIGHT JOIN Calendar
    ON Calendar.Date BETWEEN Sales.[Start Date] and Sales.[End Date];
    

    我有点好奇,为什么这里的“离散”事件……是闭门销售? :)

    where sales.sales_flag is not null
    

    where 子句将从日历中删除所有不匹配的行。

    【讨论】:

    • 啊哈——从来不知道你可以加入 on 一个范围......这肯定让大虾有些感动。这是否称为特定的连接技术? ——我以前只加入过单一的价值观。此外,Access 给了我一个恼人的无意义的错误消息“Between operator without And in query expression 'Calendar.Date BETWEEN Sales.[Start Date'”。对我做错了什么有什么想法吗?
    • 很遗憾,没有,Access sql 是它自己的语言,对我来说不是最有意义的。尝试使用谷歌搜索语法之间的访问,您应该会在那里获得成功。最坏的情况......不要在之间使用,做一个日期>开始和日期
    • 抱歉,错过了您的一个问题...不确定是否有任何特定名称。回到过去,连接子句不存在,所有内容都将放入 where 子句(包括连接)......您可以包含在 where 语句中的任何内容在技术上都可以包含在连接子句中。范围、case 语句、自定义函数……你可以真正加入任何你想要的(或任何组合)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2018-12-18
    • 2022-07-07
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多