【发布时间】:2017-03-03 11:29:22
【问题描述】:
我有一个表格,其中包含“代码”值更改的历史记录。每个月,此表都会获取一条新记录,其中包含指定月份的“代码”的新值。
+----------+------------+------------+------+
| Employee | FromDate | ToDate | Code |
+----------+------------+------------+------+
| Employee | 01/07/2016 | 31/07/2016 | 4 |
| Employee | 01/06/2016 | 30/06/2016 | 2 |
| Employee | 01/05/2016 | 31/05/2016 | 2 |
| Employee | 01/04/2016 | 30/04/2016 | 3 |
| Employee | 01/03/2016 | 31/03/2016 | 3 |
| Employee | 01/02/2016 | 29/02/2016 | 4 |
| Employee | 01/01/2016 | 31/01/2016 | 4 |
+----------+------------+------------+------+
每次“代码”更改时,我都需要按此数据分组以获取新记录,并获取“起始日期”的最小值和“截止日期”的最大值。数据必须按“FromDate”降序排列。通过我的查询,我得到了这个结果:
+----------+------------+------------+------+
| Employee | FromDate | ToDate | Code |
+----------+------------+------------+------+
| Employee | 01/05/2016 | 30/06/2016 | 2 |
| Employee | 01/03/2016 | 30/04/2016 | 3 |
| Employee | 01/01/2016 | 31/07/2016 | 4 |
+----------+------------+------------+------+
它工作正常,但如果相同的“代码”有多个日期范围(请参阅第一个表中的 4 个代码),我每个代码只有一行。我想用 2 条记录中的 4 条代码得到这个结果,因为它的周期不是连续的,但它被其他代码(3 和 2)打破了:
+----------+------------+------------+------+
| Employee | FromDate | ToDate | Code |
+----------+------------+------------+------+
| Employee | 01/07/2016 | 31/07/2016 | 4 |
| Employee | 01/05/2016 | 30/06/2016 | 2 |
| Employee | 01/03/2016 | 30/04/2016 | 3 |
| Employee | 01/01/2016 | 29/02/2016 | 4 |
+----------+------------+------------+------+
我使用这个查询:
SELECT
d."Employee",
MIN (d."FromDate") AS "FromDate",
MAX (d."ToDate") AS "ToDate",
d."Code"
FROM
(
SELECT
"Employees"."FromDate",
"Employees"."ToDate",
"Employees"."Code",
"Employees"."Employee"
FROM
schema_estelspa."Employees"
ORDER BY
"Employees"."FromDate" DESC
) d
GROUP BY
d."Code",
d."Employee"
ORDER BY
(MIN(d."FromDate")) DESC
有什么技巧可以得到我想要的结果吗?
日期格式为:dd/MM/yyyy
【问题讨论】:
-
无关,但是:你应该真的尽量避免那些可怕的引用标识符。他们的麻烦比他们值得的要麻烦得多。
-
你得到一个 4 码,因为你是按码分组的,试试不
group by -
或者只是
group by员工 -
@a_horse_with_no_name 我正在使用实体框架,它以 Pascal 大小写创建列的名称。所以我需要在 Pg 中引用它们。
-
@B4NZ41 我需要对日期进行分组(从和到),所以我不能删除分组依据,也不能按员工分组
标签: sql postgresql group-by gaps-and-islands