ere*_*ere 5 postgresql union postgresql-9.4
我有两组数据,其中一组是动态生成的。
如果我离开该列,state它会完美地工作,因为该列并不真正存在,我的问题是如何忽略 UNION 的列,以便它组合两个数据集(因为它与 UNION ALL 相同)。例如,我更喜欢第一个表,并且希望忽略第二个数据集中的任何行(如果它们存在于第一个表中)。
SELECT event_id, start_at, state
FROM event_logs
WHERE start_at BETWEEN current_date AND current_date + interval '3 weeks'
UNION
SELECT id event_id,
GENERATE_SERIES(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int - 1) + start_at::time, current_date + interval '3 weeks', '1 week'::INTERVAL) AS start_at,
'draft' AS state
FROM events
Run Code Online (Sandbox Code Playgroud)
更新,也尝试过:
WITH future_logs AS (
SELECT id event_id,
GENERATE_SERIES(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int - 1) + start_at::time, current_date + interval '3 weeks', '1 week'::INTERVAL) AS start_at,
'draft' AS state
FROM events)
SELECT future_logs.event_id, future_logs.start_at, future_logs.state
FROM future_logs
LEFT JOIN event_logs ON future_logs.event_id = event_logs.event_id AND future_logs.start_at = event_logs.start_at
WHERE event_logs.start_at BETWEEN current_date AND current_date + interval '3 weeks'
Run Code Online (Sandbox Code Playgroud)
但得到的结果太少了 77 与预期的 1000 相比。
只需添加NOT EXISTS()到第二条腿,您就可以使用它UNION ALL来避免排序/合并。
SELECT event_id, start_at, state
FROM event_logs
WHERE start_at BETWEEN current_date AND current_date + interval '3 weeks'
UNION ALL
SELECT id AS event_id
, generate_series(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int - 1) + start_at::time
, current_date + interval '3 weeks'
, '1 week'::INTERVAL) AS start_at
, 'draft' AS state
FROM events ev
WHERE NOT EXISTS ( SELECT*
FROM event_logs nx
WHERE nx.event_id =ev.id
AND nx.start_at BETWEEN current_date AND current_date + interval '3 weeks' )
;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12129 次 |
| 最近记录: |