我有一张包含id
,timestamp
和code
的表格。
ID timestamp code
1 2013-01-01 1
2 2013-01-01 2
3 2013-01-02 1
4 2013-01-02 4
...
11 2013-01-08 1
12 2013-01-08 5
我想在一个句点之间执行一个SELECT
,比如这个表中的WEEK或MONTH,我希望每一天JOIN
来自同一张表,但是一段时间一周之前。
如果我在2013-01-08那天搜索,我希望每一天,它都会被编入索引,就像这样:
ID timestamp code day_before code_before
11 2013-01-08 1 2013-01-01 1
11 2013-01-08 1 2013-01-01 2
11 2013-01-08 1 2013-01-02 1
11 2013-01-08 1 2013-01-02 4
有一天,我这样做:
SELECT i.id, i.timestamp, i.code, i2.code, i2.timestamp
FROM
table AS i
LEFT JOIN (
SELECT code, timestamp
FROM table
WHERE timestamp BETWEEN '2013-01-01' AND '2013-01-07'
) i2 ON i.id != '0'
WHERE i.timestamp BETWEEN '2013-01-08' AND '2013-01-08';
编辑:
当我说一周或其他时间进行搜索时,它仅表示我想要寻找的时间段。但搜索本身会查看此输入期间的每一天并回顾过去一周。这就是为什么我举了2013-01-08的例子并回顾2013-01-01和2013-01-02,搜索将会回溯7天。对于一天的投入期,我可以做,但我通过两天或更长时间,我不知道如何工作。
但两天或两天以上,我不知道如何。有人可以帮忙吗?
答案 0 :(得分:0)
我想你可能会想要这样的东西:
SELECT i.id, i.timestamp, i.code, i2.code, i2.timestamp
FROM table i LEFT JOIN (
table i2
ON i.id != '0' and
i2.timestamp BETWEEN i1.timestamp - interval '7 days' and i1.timestamp - interval '1 day'
WHERE i.timestamp BETWEEN '2013-01-08' AND '2013-01-08';
它比较每一行的时间戳。
答案 1 :(得分:0)
你走在正确的轨道上。您只需要取出硬编码日期并用变量替换它们。您可以在Join的“ON”子句中进行基于日期的比较,而不是使用子选择。
SELECT i1.id, i1.timestamp, i1.code, i2.code, i2.timestamp
FROM table AS i1
LEFT JOIN table As i2
ON i2.timestamp BETWEEN (i1.timestamp - 7 DAYS) and (i1.timestamp - 1 DAYS)
WHERE i1.id != '0'
注意:我在“(......)”中使用的日期表达式是伪代码。将其替换为适用于DBMS的语法。