ORACLE 表A,取OP_ID相同的两条数据,拼成一条,字段有(OP_ID) 和 (上个月KPI_DATE的挽留成功率) 和 (这个月KPI_DATE的挽留成功率) 和 (拆机量)
时间: 2024-09-24 10:26:01 浏览: 40
在Oracle数据库中,如果你想从表A中获取OP_ID相同的两条记录,并将它们合并为一条新的记录,可以使用SQL的UNION ALL或者ROW_NUMBER()窗口函数结合CASE WHEN。这里是一个基本的示例:
```sql
SELECT OP_ID,
MAX(CASE WHEN MONTH(KPI_DATE) = (MONTH(LAST_KPI_DATE) - 1) THEN KPI_DATE END) AS 上个月KPI_DATE留率,
MAX(CASE WHEN MONTH(KPI_DATE) = MONTH(NOW()) THEN KPI_DATE END) AS 这个月KPI_DATE留率,
SUM(CASE WHEN MONTH(KPI_DATE) = MONTH(NOW()) THEN 拆机量 ELSE 0 END) AS 拆机量
FROM (
SELECT OP_ID, KPI_DATE, 拆机量,
ROW_NUMBER() OVER(PARTITION BY OP_ID ORDER BY KPI_DATE DESC) as rn
FROM A
)
WHERE rn IN(1, 2)
GROUP BY OP_ID;
```
在这个查询中,首先通过ROW_NUMBER()函数按OP_ID分组并按KPI_DATE降序排序,然后选择行号为1和2的记录。接着,内部子查询中我们通过CASE WHEN分别计算上个月和本月的数据。最后,外部查询通过MAX和SUM聚合了这些值。
相关问题
ORACLE 表A,取OP_ID相同的两条数据,拼成一条,字段有(OP_ID) 和 (上个月KPI_DATE的挽留成功率) 和 (这个月KPI_DATE的挽留成功率)
在Oracle中,如果你想要合并OP_ID相同的行,并获取上个月和这个月的KPI_DATE对应的挽留成功率,你可以使用`UNION ALL`操作和窗口函数。假设表A有一个名为`prev_month_retention_rate`的历史挽留成功率字段,你可以尝试以下查询:
```sql
SELECT
OP_ID,
LAG(prev_month_retention_rate) OVER (PARTITION BY OP_ID ORDER BY KPI_DATE) AS 上个月挽留成功率,
prev_month_retention_rate AS 这个月挽留成功率
FROM (
SELECT
OP_ID,
KPI_DATE,
prev_month_retention_rate,
ROW_NUMBER() OVER (PARTITION BY OP_ID ORDER BY KPI_DATE DESC) as row_num
FROM table_A
)
UNION ALL
SELECT
OP_ID,
NULL AS 上个月挽留成功率, -- 如果上个月没有数据,可以设置NULL或适当值
KPI_DATE AS 这个月挽留成功率,
prev_month_retention_rate
FROM (
SELECT
OP_ID,
KPI_DATE,
prev_month_retention_rate
FROM table_A
WHERE KPI_DATE = (SELECT MAX(KPI_DATE) FROM table_A WHERE OP_ID = A.OP_ID) -- 获取每个OP_ID的最新KPI_DATE
)
WHERE row_num IN (1, 2); -- 选取最近两个月的数据
```
这个查询首先通过窗口函数`LAG`获取上个月的挽留成功率,然后结合`UNION ALL`分别处理当前月和上个月的数据。`ROW_NUMBER()`用于给每个OP_ID内的记录排序,这样我们就可以选取最近两个月的KPI_DATE。
请注意,这个查询假设`table_A`中的挽留成功率字段`prev_month_retention_rate`存储的是上个月的数据。如果有其他情况,可能需要调整SQL语句。
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)。
阅读全文