oracle 查询记录表 获取每个人的最后一条操作记录
时间: 2024-09-24 16:25:52 浏览: 49
在Oracle数据库中,获取每个人的最后一条操作记录通常涉及到分组查询以及使用`ROW_NUMBER()`窗口函数来确定每个用户的最新操作。假设有一个名为`operation_records`的表,包含用户ID(`user_id`)、操作时间(`operation_time`)等字段,你可以使用以下SQL查询:
```sql
SELECT user_id, MAX(operation_time) AS last_operation_time
FROM (
SELECT user_id, operation_time,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY operation_time DESC) as row_num
FROM operation_records
) subquery
WHERE row_num = 1
GROUP BY user_id;
```
这个查询的工作原理是首先按用户ID分区并按照操作时间降序排序,然后在每个分区内部计算行号。最新操作的时间将在行号为1的记录中,最后通过`GROUP BY`将结果汇总到每个用户。
相关问题
oracle 查询记录表 获取每个人的最后一条操作记录 根据部门,因为有可能某个员工在中途更换部门
在Oracle查询中,获取每个人最后一条操作记录并考虑他们可能的部门变动,可以使用子查询、连接(JOIN)以及ROW_NUMBER()窗口函数。假设我们有两个表,一个是`employees`存储基本信息(id, name, department_id),另一个是`operations`存储操作记录(operation_id, employee_id, operation_date)。
首先,我们需要确定每个员工在当前部门的最新操作日期。可以这样做:
```sql
WITH latest_operations AS (
SELECT e.id, e.name, e.department_id,
op.operation_date as last_operation_date
FROM employees e
LEFT JOIN operations op ON e.id = op.employee_id
WHERE (e.department_id IS NULL OR op.operation_date = (
SELECT MAX(operation_date)
FROM operations
WHERE employee_id = e.id AND operation_date >= e.start_date -- 假设start_date字段表示员工加入部门的日期
))
ORDER BY e.department_id, op.operation_date DESC
ROW_NUMBER() OVER(PARTITION BY e.id ORDER BY op.operation_date DESC) as rn
)
SELECT * FROM latest_operations
WHERE rn = 1;
```
这里的关键点在于`latest_operations`子查询中,通过`ROW_NUMBER()`函数按员工ID分组,并保证每个员工的最近操作记录是他们的最高行号(rn = 1)。如果员工从未改变过部门,则会选择他的第一条记录(因为最早日期通常对应行号1)。
oracle 查询 每个部门 每个人 最后一条操作记录
在Oracle数据库查询中,如果你想要获取每个部门(假设有一个名为`departments`的表和一个名为`employees`的表,以及一个代表操作记录的表如`activity_records`),你可以使用子查询和连接(JOIN)来完成这个任务。这里是一个基本的SQL查询示例:
```sql
SELECT d.department_name, e.employee_name, ar.operation_date
FROM departments d
JOIN employees e ON d.department_id = e.department_id
JOIN (
SELECT department_id, MAX(operation_date) as latest_operation_date
FROM activity_records
GROUP BY department_id
) max_rec ON e.department_id = max_rec.department_id AND ar.operation_date = max_rec.latest_operation_date;
```
这个查询的工作原理是:
1. 内部子查询(max_rec)找到每个部门的最新操作日期。
2. 外部查询将员工表(employees)与部门表(departments)连接,并进一步与内部子查询结果连接,只选择那些操作日期等于最新操作日期的记录。
阅读全文