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 使用两个不同的表进行操作:Table1
和 Table2
。
@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 根据日期选择行的主要内容,如果未能解决你的问题,请参考以下文章
如何编辑我的 postgreSQL 查询以按日期选择几列的最新行