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