我不明白为什么我的两个表行为不正确,生成的系列不会在联接表上显示。
TABLE 1: attendance
id | employee_id | flag | entry_date
-------------------------------
1 | 1 | 0 | 2017-11-17
2 | 2 | 0 | 2017-11-17
3 | 3 | 0 | 2017-11-17
这是我的疑问:
SELECT
attendance.employee_id,
TO_CHAR(series::date, 'YYYY-MM-DD')
FROM generate_series('2017-11-16', '2017-11-30', '1 day'::INTERVAL) series
LEFT JOIN (
SELECT
employee_id,
to_char(entry_date, 'YYYY-MM-DD') entry_date
FROM
attendance
WHERE entry_at >= '2017-11-16' AND entry_at <= '2017-11-30'
GROUP BY to_char(entry_at, 'YYYY-MM-DD'), employee_id
) attendance ON attendance.entry_date = TO_CHAR(series::date, 'YYYY-MM-DD')
ORDER by employee_id
结果是:
employee_id | to_char
------------------------
1 | 2017-11-17
2 | 2017-11-17
3 | 2017-11-17
我期待2017-11-16
显示自我生成的系列在上述日期开始以来会有所不同。
预期结果:
employee_id | to_char
------------------------
null | 2017-11-16
null | 2017-11-16
null | 2017-11-16
1 | 2017-11-17
2 | 2017-11-17
3 | 2017-11-17
这是一个要测试的示例SQL小提琴: http://sqlfiddle.com/#!17/d7907/3
更新[2017年1月4日]:看起来我错误地思考,我决定执行相关子查询
我想要做的是根据 generated_series 计算日期数。
答案 0 :(得分:1)
很难理解,你真正需要什么。您所描述的“结果是” - 这些是您的内部查询中的行。如果您使用此内部查询保留join generate_series,则除2017-11-17之外的每个日期将获得1个空行,2017-11-17将为3行。我查了一下 - 它按预期工作:
employee_id | to_char
-------------+------------
1 | 2017-11-17
2 | 2017-11-17
3 | 2017-11-17
| 2017-11-20
| 2017-11-21
| 2017-11-22
| 2017-11-23
| 2017-11-24
| 2017-11-25
| 2017-11-26
| 2017-11-27
| 2017-11-28
| 2017-11-29
| 2017-11-16
| 2017-11-30
| 2017-11-18
| 2017-11-19