【发布时间】:2019-10-14 15:59:48
【问题描述】:
我有两张桌子 - 我们称它们为 week 和 contract,如下所示:
Week Contract
emp_id | starting | data1 | ... emp_id | from_date | data2 | ...
-------|------------|-------|-- -------|------------|-------|--
12 | 2019-01-08 | abcd | 12 | 2018-08-01 | efgh |
12 | 2019-01-15 | abcd | 13 | 2018-10-02 | efgh |
12 | 2019-01-22 | abcd | 13 | 2019-01-15 | ijkl |
13 | 2019-01-08 | abcd | 13 | 2019-03-19 | mnop |
13 | 2019-01-15 | abcd | 14 | 2017-02-02 | efgh |
13 | 2019-01-22 | abcd | 15 | 2018-01-19 | efgh |
week.starting 字段是一个相当固定间隔的日期(时间设置为午夜的日期时间)。 (emp_id,starting) 的具体组合是唯一的。 from_date 字段也是记录contract 记录适用的开始期间的日期。这可能是在未来,所以我们不能只做一个MAX(from) 并为每个员工获得正确的合同。目前, (emp_id, from_date) 是唯一的,但我不想依赖它。 week.starting 和 contract.from_date 可以相同。
我想要一个返回整个 week 记录的查询,并且对于每个记录,任何 contract 的记录当时处于活动状态 - 也就是说,from_date 最大但仍小于或等于的记录到week.starting。如果我有特定的一周,获得这份合同是一个非常简单的最大 n-per-group 问题:
SELECT * FROM contract
WHERE contract.emp_id = @emp_id AND contract.from_date <= @starting
ORDER BY contract.from_date DESC
LIMIT 1
但我不知道如何在查询中执行此操作以获取week 中的每条记录。我的特定障碍组合意味着我无法找到答案,尽管这是一组常见的问题。我似乎无法将week.starting 传递到子查询中,而且我似乎也无法在连接中使用 LIMIT 。到目前为止,我最好的尝试最终加入了所有不到一周的合同。
什么查询会返回我正在寻找的结果?
emp_id | starting | from_date | data1 | data2 | ...
-------|------------|------------|-------|-------|--
12 | 2019-01-08 | 2018-08-01 | abcd | efgh |
12 | 2019-01-15 | 2018-08-01 | abcd | efgh |
12 | 2019-01-22 | 2018-08-01 | abcd | efgh |
13 | 2019-01-08 | 2018-10-02 | abcd | efgh |
13 | 2019-01-15 | 2019-01-15 | abcd | ijkl |
13 | 2019-01-22 | 2019-01-15 | abcd | ijkl |
【问题讨论】:
-
您提供条件的依据是什么,例如:for emp_id = 13 13 --> 2019-01-08 ---> 2018-10-02 13 --> 2019-01-15 - -> 2019-01-15 13 --> 2019-01-22 --> 2019-01-15
-
抱歉,我在示例表中打错了字。有些日期应该是 2019 年,而不是 2018 年。
标签: sql postgresql date greatest-n-per-group