SQL 根据日期选择行

Posted

技术标签:

【中文标题】SQL 根据日期选择行【英文标题】:SQL Select rows based on date 【发布时间】:2014-09-18 02:17:29 【问题描述】:

我有两个表(Table1 和 Table2):

表1

Date          Name   Other
2014-02-08    Alex   1
2014-06-15    Bob    1

表2

Date          Name    Count
2014-02-07    Alex    1
2014-01-31    Alex    2
2014-02-09    Alex    4
2014-02-08    Alex    10
2014-02-10    Alex    0
2014-02-01    Alex    4
2014-01-08    Alex    5
2014-03-08    Alex    4
2014-06-01    Bob     22
2014-06-02    Bob     0
2014-06-10    Bob     9
2014-06-15    Bob     3
2014-06-16    Bob     3
2014-06-20    Bob     5
2014-06-14    Bob     18
2014-07-11    Bob     1
2014-08-15    Bob     2

我很难构建完成以下任务的查询:

    从 Table1 中,遍历每个“日期”和“名称” 对于表 1 中给定的“日期”和“名称”,遍历表 2 并获取所有具有相同“名称”且日期早于“日期”(在表 1 中)和 5 天的行“日期”之后的天数(在表 1 中)。

因此,对于“2014-02-08”上的 Table1,“Alex”,我想获取 Table2 中所有也显示“Alex”但日期在“2014-01-29”之间的行(10 天前2014-02-08)和“2014-02-13”(2014-02-08 后 5 天)。

对于“2014-06-15”上的“Bob”,我想抓取 Table2 中所有也显示“Bob”但日期在“2014-06-05”之间(2014-06 前 10 天)的行15) 和“2014-06-20”(2014-06-15 后 5 天)。

预期的输出是:

Date          Name    Count
2014-02-07    Alex    1
2014-01-31    Alex    2
2014-02-09    Alex    4
2014-02-08    Alex    10
2014-02-10    Alex    0
2014-02-01    Alex    4
2014-06-10    Bob     9
2014-06-15    Bob     3
2014-06-16    Bob     3
2014-06-20    Bob     5
2014-06-14    Bob     18

在我的实际工作中,Table1 中的行数要大得多,我想在参考日期之前/之后抓取的天数可能会有所不同。

【问题讨论】:

似乎有什么问题?你被困在哪里了? 这是 mysql 还是 MS SQL? @PM 77-1:我只学习了基本的 SQL 教程,并且只处理了单个表。此时处理两张表的逻辑让我难以理解。 @Rajesh:如标签中所述,Netezza SQL。 现在是学习更难的教程的时候了。 【参考方案1】:

我认为你可以这样做:

select t2.*
from table1 t2
where exists (select 1
              from table1 t1
              where t1.name = t2.name and t1.date >= t2.date - 'interval 10 day' and
                    t1.date <= t2.date + 'interval 10 day'
             );

【讨论】:

OP 使用两个不同的表进行操作:Table1Table2 @Gordon Linoff:对不起,我对 SQL 完全陌生。我想我得到了大部分查询(假设它是我必须查找的有效语法)但是“select 1”是什么意思? SELECT 1 将返回 1。当我们只需要检查匹配记录的存在时使用它,因此不需要获取任何字段。它通常与EXISTS子句一起使用。 @Gordon Linoff:查询应该是“select t2.* from table2 t2”而不是“table1 t2”吗?或者,真的,“Table1”和“Table2”......【参考方案2】:

见:

http://sqlfiddle.com/#!4/82e1e/10

假设是 Oracle,但您明白了:-)。您需要在结果中格式化日期。这留给你细读。

万一上面的链接打不开,sql是:

select t2.*
from
  table2 t2, table1 t1
where
  t1.name = t2.name
  and t2.date1 > t1.date1 -10 
  and t2.date1 <= t1.date1 +5;

结果是:

DATE1                           NAME    COUNT
February, 07 2014 00:00:00+0000 Alex    1
January, 31 2014 00:00:00+0000  Alex    2
February, 09 2014 00:00:00+0000 Alex    4
February, 08 2014 00:00:00+0000 Alex    10
February, 10 2014 00:00:00+0000 Alex    0
February, 01 2014 00:00:00+0000 Alex    4
June, 10 2014 00:00:00+0000     Bob     9
June, 15 2014 00:00:00+0000     Bob     3
June, 16 2014 00:00:00+0000     Bob     3
June, 20 2014 00:00:00+0000     Bob     5
June, 14 2014 00:00:00+0000     Bob     18

【讨论】:

以上是关于SQL 根据日期选择行的主要内容,如果未能解决你的问题,请参考以下文章

Mysql,根据日期选择行

SQL 根据当前日期减去两天选择记录

SQL 查询不会选择日期之间的所有行

如何编辑我的 postgreSQL 查询以按日期选择几列的最新行

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行

使用sql根据日期差异选择记录