Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL中的组内组_Sql_Oracle - Fatal编程技术网

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中,但是查询应该在任何具有正常实现的
行数
的数据库上运行)

非常感谢,它工作得非常好。只是需要根据我的需要进行一些调整。