选择两个时间序列的划分

时间:2017-03-27 15:26:19

标签: sql postgresql

我有第一个问题:

WITH one_day_intervals AS (
  SELECT date_trunc('day', (current_date-offs-2)) AS start_time,
         date_trunc('day', (current_date-offs-1)) AS end_time
  FROM generate_series(1, 7, 1) AS offs
)
SELECT start_time, end_time, x
FROM (
  SELECT i.start_time AS start_time, i.end_time AS end_time, count(*) AS x
  FROM (
    SELECT created
    FROM tracking_msg AS tm
    WHERE tm.cid='ae69123c-cb29-420b-9a65-bbe6ae156f57' AND tm.sid NOT IN (SELECT sid FROM session_msg)
  ) AS sub1
  RIGHT JOIN one_day_intervals AS i ON sub1.created >= i.start_time AND sub1.created < i.end_time
  GROUP BY i.start_time, i.end_time ORDER BY i.start_time
) AS sub2; 


在输出中: image1

第二个问题:

WITH one_day_intervals AS (
  SELECT date_trunc('day', (current_date-offs-2)) AS start_time,
         date_trunc('day', (current_date-offs-1)) AS end_time
  FROM generate_series(1, 7, 1) AS offs
)
SELECT start_time, end_time, y
FROM (
  SELECT i.start_time AS start_time, i.end_time AS end_time, count(*) AS y
  FROM (
    SELECT created
    FROM tracking_msg AS tm
    WHERE tm.cid='ae69123c-cb29-420b-9a65-bbe6ae156f57' AND tm.sid IN (SELECT sid FROM session_msg)
  ) AS sub1
  RIGHT JOIN one_day_intervals AS i ON sub1.created >= i.start_time AND sub1.created < i.end_time
  GROUP BY i.start_time, i.end_time ORDER BY i.start_time
) AS sub2;


输出:image2

每个查询都具有相同的日期。我想选择start_time,end_time和x / y

1 个答案:

答案 0 :(得分:0)

所以,基本上xy之间的区别在于tm.sidIN / NOT IN另一个表。

您可以使用conditional aggregation

一次计算两者
SELECT ...,
       COUNT(*) FILTER (WHERE tm.sid NOT IN (SELECT sid FROM session_msg)) AS x,
       COUNT(*) FILTER (WHERE tm.sid IN     (SELECT sid FROM session_msg)) AS y

或者,使用较旧的PostgreSQL(9.3或之前版本):

SELECT ...,
       COUNT(CASE WHEN tm.sid NOT IN (SELECT sid FROM session_msg) THEN 1 END) AS x,
       COUNT(CASE WHEN tm.sid IN     (SELECT sid FROM session_msg) THEN 1 END) AS y