Sql 在与或之间使用

Sql 在与或之间使用,sql,amazon-redshift,Sql,Amazon Redshift,我正在执行一个连接,在这里我需要获取某一天的特定数据,如果该数据存在,则完美地获取它,如果不获取前一天的数据。我不确定哪一个是最佳解决方案,在日期范围之间使用,或者使用或。以下是一个查询示例: INSERT INTO #table2 SELECT #table1.id, #table1.ordertime, A.current as current FROM #table1 L

我正在执行一个连接,在这里我需要获取某一天的特定数据,如果该数据存在,则完美地获取它,如果不获取前一天的数据。我不确定哪一个是最佳解决方案,在日期范围之间使用
,或者使用
。以下是一个查询示例:

INSERT INTO #table2
               SELECT #table1.id, #table1.ordertime,
               A.current as current
               FROM #table1
               LEFT JOIN #exchange as A
               ON #table1.id = A.source
               AND (#table1.ordertime::date = A.begin::date
               OR #table1.ordertime::date = dateadd(d,-1, #A.begin)::date);

INSERT INTO #table2
               SELECT #table1.id, #table1.ordertime,
               A.current as current
               FROM #table1
               LEFT JOIN #exchange as A
               ON #table1.id = A.source
               AND #table1.ordertime::date BETWEEN A.begin::date AND dateadd(d,-1, #A.begin)::date

您当前的解决方案将捕获两个日期(如果存在),可能会插入您想要的更多行

更好的方法是加入两次-一次用于匹配日期,一次用于前一天,并获取第一个非空值:

INSERT INTO #table2
   SELECT
       #table1.id
   ,   #table1.ordertime
   ,   COALESCE(A.current, B.current) as current
   FROM #table1
   LEFT JOIN #exchange as A ON #table1.id = A.source AND #table1.ordertime::date = A.begin::date
   LEFT JOIN #exchange as B ON #table1.id = B.source AND #table1.ordertime::date = dateadd(d,-1, #B.begin)::date

现在,您可以保证在
#表2
中为
#表1
中的每一行指定一行,我不会使用任何一行。相反,使用不平等:

AND (#table1.ordertime >= (A.begin - interval '1 day')::date
     #table1.ordertime < (A.begin + interval '1 day')::date
和(#table1.ordertime>=(A.begin-间隔“1天”)::日期
#表1.ordertime<(A.begin+间隔“1天”)::日期
通过将所有“函数”和强制转换放在一边,有希望为
连接使用索引(如果可用)


如果您只对
A.begin
的日期组件感兴趣,那么您可能希望将值存储为日期,而不包含时间组件。

同样的事情。品味问题。因此没有性能提升,有趣,感谢您的快速回复!同样的事情。BETWEEN看起来不错:)由于将字段值
#table1.ordertime::date
与函数结果
dateadd(d,-1,#a.begin)::date
进行比较,强制生成一个表,因此性能同样糟糕scan@PanagiotisKanavos那么什么是更好的解决方案呢?
Redshift
中没有索引的概念,不幸的是,只有节点的分发密钥,这是一篇专栏文章DB@eagle . . . 我想我是在关注博士后的标签。很公平,是的,没有任何索引确实让人沮丧