通过其他查询结果删除/过滤数据

时间:2014-12-26 03:35:56

标签: sql postgresql

LIST-OF-DAYS = SELECT day FROM TABLE1

表1中的样本数据

         day
---------------------
 2014-01-20 00:00:00
 2014-01-21 00:00:00
 2014-01-22 00:00:00

我想通过以上结果删除/过滤数据 LIST-OF-DAYS

如何在SELECT datetime, value FROM TABLE2

上应用过滤器约束( LIST-OF-DAYS

表2中的样本数据

           datetime        | volume
    -----------------------+--------
     2014-01-02 01:14:00.5 |    364
     2014-01-20 01:15:01.5 |    149
     2014-01-22 01:15:01.5 |    149      

PSUDO CODE

SELECT * FROM TABLE2 WHERE (TABLE2.datetime in LIST_OF_DAYS)

顺便说一句, TABLE2

上有一列日期时间

因此,

  • 如果 datetime = 2014-01-20 19:13:00
  • ,则应保留
  • 如果日期时间 = 2014-03-20 09:10:20
  • ,则应删除

最终结果应为

           datetime        | volume
    -----------------------+--------
     2014-01-20 01:15:01.5 |    149
     2014-01-22 01:15:01.5 |    149

2 个答案:

答案 0 :(得分:0)

SELECT * FROM TABLE2 where day in (SELECT day FROM TABLE1);

这只是一个如何在另一个查询中使用查询结果的示例。 where子句将仅选择 TABLE2 ' 列值与 TABLE1' day'匹配的行。 列值。

答案 1 :(得分:0)

您希望来自table2的行,其中day列中的值存在于table1.day中。为此使用[INNER] JOIN 数据类型还有一些复杂性。您拥有它的方式,数据类型为timestamp

SELECT t2.*
FROM   table1 t1
JOIN   table2 t2 ON t2.datetime >= t1.day
                AND t2.datetime <  t1.day + interval '1 day';

如果您对table1.day使用datet2.datetime仍然是时间戳),则更简单:

SELECT t2.*
FROM   table1 t1
JOIN   table2 t2 ON t2.datetime >= t1.day
                AND t2.datetime <  t1.day + 1;  -- just add int to date

还有一个较短的形式:

JOIN   table2 t2 ON t2.datetime::date = t1.day::date

但上面的长版本为sargable,可以在table2.datetime上使用索引