带时间戳的SELECT动态返回来自同一个表的结果

时间:2014-03-17 13:24:42

标签: sql postgresql select timestamp

我有一张包含idtimestampcode的表格。

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天。对于一天的投入期,我可以做,但我通过两天或更长时间,我不知道如何工作。

但两天或两天以上,我不知道如何。有人可以帮忙吗?

2 个答案:

答案 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的语法。