我有第一个问题:
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
答案 0 :(得分:0)
所以,基本上x
和y
之间的区别在于tm.sid
是IN
/ 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