Oracle SQL返回优先&;按分区列出的不同列的最后一个值

Oracle SQL返回优先&;按分区列出的不同列的最后一个值,sql,oracle,Sql,Oracle,我需要一个查询的帮助,该查询将在下面的数据集中为每个分区返回一条记录。我使用稠密_秩来获取每个分区中的顺序和第一/最后位置,但问题是我需要为每个员工项目_ID组合获取一条记录,其中包含: MIN(开始),它是带有时间的日期类型 SUM(DURATION),表示活动秒数的数字类型 初始_状态的最小排序值 FIN_状态的最大排名值 以下是初始数据表、按秩排序的同一数据表以及末尾的所需结果(见下图): 此外,下面是用于获取具有秩值的有序表的代码: SELECT T.*, DENSE_RAN

我需要一个查询的帮助,该查询将在下面的数据集中为每个分区返回一条记录。我使用稠密_秩来获取每个分区中的顺序和第一/最后位置,但问题是我需要为每个员工项目_ID组合获取一条记录,其中包含:

  • MIN(开始),它是带有时间的日期类型
  • SUM(DURATION),表示活动秒数的数字类型
  • 初始_状态的最小排序值
  • FIN_状态的最大排名值
以下是初始数据表、按秩排序的同一数据表以及末尾的所需结果(见下图):

此外,下面是用于获取具有秩值的有序表的代码:

SELECT T.*,
    DENSE_RANK() OVER (PARTITION BY T.EMPLOYEE, T.ITEM_ID ORDER BY T.START) AS D_RANK
FROM TEST_DATA T
ORDER BY T.EMPLOYEE, T.ITEM_ID, T.START;

使用
第一个/最后一个
选项查找状态。其余部分是典型的聚合:

select employee, min(start_), sum(duration),
       max(init_status) keep (dense_rank first order by start_),
       max(fin_status)  keep (dense_rank last  order by start_)
  from test_data t
  group by employee, item_id
  order by employee, item_id;

start
是一个保留字,所以我在测试中使用了
start

使用
first/last
选项查找状态。其余部分是典型的聚合:

select employee, min(start_), sum(duration),
       max(init_status) keep (dense_rank first order by start_),
       max(fin_status)  keep (dense_rank last  order by start_)
  from test_data t
  group by employee, item_id
  order by employee, item_id;

start
是一个保留字,所以我在测试中使用了
start

谢谢您解决这个问题。我在FIRST/LAST上阅读了Oracle文档,其中说明输入应该是数字类型,或者可以隐式转换为数字,因此我假设VARCHAR2字段上的MAX/MIN函数不起作用。我想我应该尝试一下,因为我的思路是正确的。日期、时间戳、varchar值通常用于排序,它们可以在这里使用。我们可以说哪个时间戳或字符串更大,哪个是第一个还是最后一个。感谢您解决这个问题。我在FIRST/LAST上阅读了Oracle文档,其中说明输入应该是数字类型,或者可以隐式转换为数字,因此我假设VARCHAR2字段上的MAX/MIN函数不起作用。我想我应该尝试一下,因为我的思路是正确的。日期、时间戳、varchar值通常用于排序,它们可以在这里使用。我们可以说哪个时间戳或字符串更大,哪个是第一个或最后一个。