Oracle SQL中的组内组
我有以下格式的数据:Oracle SQL中的组内组,sql,oracle,Sql,Oracle,我有以下格式的数据: ID GROUP DATE 1 A 01-Sep-2017 1 A 02-Sep-2017 1 C 03-Sep-2017 1 C 04-Sep-2017 1 C 05-Sep-2017 1 B 06-Sep-2017 1 B 07-Sep-2017 1 A 08-Sep-2017 1 A 09-Sep-2017 1 C 10-Sep-2017 所需输出如下所示: ID G
ID GROUP DATE
1 A 01-Sep-2017
1 A 02-Sep-2017
1 C 03-Sep-2017
1 C 04-Sep-2017
1 C 05-Sep-2017
1 B 06-Sep-2017
1 B 07-Sep-2017
1 A 08-Sep-2017
1 A 09-Sep-2017
1 C 10-Sep-2017
所需输出如下所示:
ID GROUP START_DATE END_DATE
1 A 01-Sep-2017 02-Sep-2017
1 C 03-Sep-2017 05-Sep-2017
1 B 06-Sep-2017 07-Sep-2017
1 A 08-Sep-2017 09-Sep-2017
1 C 10-Sep-2017 10-Sep-2017
如果我尝试使用simple group by,它将加入集团领域,这样A将从2017年9月1日开始,到2017年9月9日结束,而它将在2017年9月2日结束,然后从2017年9月8日重新开始。我尝试了各种分析函数,首先为每个子组分配一个唯一的编号,得到如下结果:
ID GROUP DATE RANK
1 A 01-Sep-2017 1
1 A 02-Sep-2017 1
1 C 03-Sep-2017 2
1 C 04-Sep-2017 2
1 C 05-Sep-2017 2
1 B 06-Sep-2017 3
1 B 07-Sep-2017 3
1 A 08-Sep-2017 4
1 A 09-Sep-2017 4
1 C 10-Sep-2017 5
现在它只是在新字段上简单分组的一种情况,但无法获得所需的秩列
这方面的任何帮助或实现相同目标的任何其他方法
谢谢。解决这个问题的一种方法是行号差异法。用纯语言解释有点困难,所以我邀请您探索下面的演示,把它拆开,等等,直到您看到它是如何工作的。基本上,我们计算整个表的行号(按日期排序)与按组划分的行号之间的差值。然后,我们可以根据您的组列和这个行号差异进行聚合,以获得您要针对的每个时间块的伪组
SELECT
grp,
MIN(date) AS START_DATE,
MAX(date) AS END_DATE
FROM
(
SELECT
grp, date,
ROW_NUMBER() OVER (ORDER BY date) -
ROW_NUMBER() OVER (PARTITION BY grp ORDER BY date) diff
FROM yourTable
) t
GROUP BY
grp, diff
ORDER BY
MIN(date);
输出:
此处演示:
(演示程序在SQL Server中,但是查询应该在任何具有正常实现的
行数
的数据库上运行)非常感谢,它工作得非常好。只是需要根据我的需要进行一些调整。