我有一个包含4列的表:Worker_id、Month、Basic_Salary. 我正在try 编写一个脚本,返回Worker_id、最后一次工资日期、第二次基本工资日期、最后一次工资金额(从BASIC_SALARY列).

以下是我写的 playbook :

with cte as (
  select WORKER_ID,  (select max(month) from workers_table) last_salary
    , ROW_NUMBER()over (partition by worker_id order by month) rn
  from workers_table
  group by WORKER_ID,month
)
select *
from cte 
where rn=2

以下是数据样本:

enter image description here

我得到的数据是:

WORKER_ID   last_salary rn
2011-11-11  2022-01-04  2
2011-11-12  2022-01-04  2
2011-11-13  2022-01-04  2
2011-11-14  2022-01-04  2
2011-11-15  2022-01-04  2
2011-11-16  2022-01-04  2

LAST_SALARY列不正确,我找不到修复它的方法并获得正确的结果.

推荐答案

试着像下面这样做.拿到你的cte英镑,不要用GROUP BY英镑.从cte个有条件自结合为第一个有rn = 1个,第二个有rn = 2个.更新SELECT语句.请勾选下面的查询.

;WITH cte AS (
    SELECT WORKER_ID,
           month,
           basic_salary,
           ROW_NUMBER() OVER (PARTITION BY worker_id ORDER BY month) AS rn
    FROM WORKERS_TABLE
)
SELECT c1.WORKER_ID,
       c1.month AS LastSalaryDate,
       c1.basic_salary As Last_basic_salary,
       c2.month AS SecondLastSalaryDate 
FROM cte c1
    JOIN cte c2 ON c1.WORKER_ID = c2.WORKER_ID
WHERE c1.rn = 1 AND c2.rn = 2

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

SQL(PostgreSQL)从条件创建点表

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

不同表达方式时的大小写

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

SQL:如何在表中同时使用GROUPING和CONDITION?

对表进行多项 Select 以返回最大值和时间

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

嵌套Json对象的SQL UPDATE WHERE

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

将SQL Server查询改进为;线程安全;

根据具有特定值的 ID 创建自定义组

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

正则表达式忽略特定数据部分的分隔符

为 sqlite 全文搜索 (fts) 创建触发器时出现虚拟表的不安全使用

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

SQL查询以获取从特定可变日期看到的用户