如何为每个声明日期选择每个公司的最新记录?

时间:2018-04-10 16:41:47

标签: sql sql-server

我有一个数据库,为每个财务报表日期存储不同公司的财务信息。 A公司的记录为2016年12月31日,2015年12月31日,等等。如果有人编辑该记录,我的数据库还会为每个公司的每个对帐单日期存储多条记录,例如,如果有人在2016年12月31日的资产负债表的现金行中输入了错字。在这种情况下,A公司将有12/31/2016的两条记录,一条用于初始条目,最新一条包括编辑。

我的查询当前会提取每12个月声明日期的所有记录,包括所有更新记录。我试图插入一个Rank,以便它只为每个公司的每个语句日期提取最新记录,但是然后查询仅提取该公司的最新记录,忽略之前的语句日期。

我理想的结果是有这样的东西:

公司A | 12/31/16 |其他信息

公司A | 12/31/15 |其他信息

公司A | 12/31/14 |其他信息

COMPANY B | 12/31/16 |其他信息

目前没有Rank,它拉动:

Stmt_id |公司| FS_date | fs_id | num_of_months | KSOR | last_update |等级

000001 | Comp A | 2018-03-31 | 1001 | 12 | KSOR | 2018-04-06 14:24:49.227 | 1

000002 | Comp A | 2018-03-31 | 1001 | 12 | KSOR | 2018-04-06 10:49:22.530 | 2

000013 | Comp B | 2018-01-31 | 2002 | 12 | KSOR | 2018-03-07 14:32:04.843 | 28

000015 | Comp B | 2018-01-31 | 2002 | 12 | KSOR | 2018-03-07 12:48:34.533 | 29

000016 | Comp B | 2018年1月31日| 2002 | 12 | KSOR | 2018-03-07 12:20:08.180 | 30

以下是我的问题:

WITH CTE
AS (
SELECT [Stmt_ID]
,[Company]
,[fs_date]
,[fs_ID]
,[NUMBER_OF_MONTHS]
,[KSOR]
,[LAST_update]

,RANK() OVER (
PARTITION BY [fs_date] ORDER BY [stmt_ID] DESC
) AS RANKNUM

FROM [dbo].[SIRV] 
)
Select *
FROM CTE 
WHERE RANKNUM = 1 AND [NUMBER_OF_MONTHS] = 12 
order by [fs_date] desc

1 个答案:

答案 0 :(得分:0)

您需要正确的partition by

WITH CTE AS (
       SELECT s.*,
              ROW_NUMBER() OVER (PARTITION BY company, fs_date
                                 ORDER BY stmt_ID DESC
                                ) as seqnum
      FROM [dbo].[SIRV] s
     )
SELECT CTE.*
FROM CTE 
WHERE seqnum = 1 AND NUMBER_OF_MONTHS = 12 
ORDER BY fs_date DESC;