Sql 选择两个时间序列的划分

Sql 选择两个时间序列的划分,sql,postgresql,Sql,Postgresql,我的第一个问题是: 在输出端: 第二个问题: 输出: 每个查询都有相同的日期周期。我想选择开始时间、结束时间和x/y,因此,x和y之间的基本区别在于tm.sid在另一个表中/不在另一个表中 您可以使用以下方法同时计算这两个参数: 或者,对于较旧的PostgreSQL 9.3或更早版本: SELECT ..., COUNT(CASE WHEN tm.sid NOT IN (SELECT sid FROM session_msg) THEN 1 END) AS x, CO

我的第一个问题是:

在输出端: 第二个问题:

输出:
每个查询都有相同的日期周期。我想选择开始时间、结束时间和x/y,因此,x和y之间的基本区别在于tm.sid在另一个表中/不在另一个表中

您可以使用以下方法同时计算这两个参数:

或者,对于较旧的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

我试图修复SQL的格式,但是SO接口声称我的帖子有太多的代码。我不明白我应该如何在查询中使用它。你能解释一下吗?@PetroProkopovych而不是COUNT*。您不需要两个单独的查询,您只能使用一个在WHERE子句中不过滤tm.sid的查询,而在…中使用tm.sid[not],但它不起作用,因为我在定义tm之前使用了tm.sid
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;
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
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