我有一个数据库,为每个财务报表日期存储不同公司的财务信息。 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
答案 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;