如何在重复行的情况下获得前一行的最大值,并采用每个最大列的优先级



我有一个表,其中包含帐户行和有关帐户的详细信息。我创建了一个符合我的条件的临时表,并称之为#temp2。现在,我需要做的是从原始表中获取符合其他条件的前一行的最大值,该条件与已被获取到临时表的当前行不同。我正在处理的问题是我需要采取的最大前一行的方式。简单的方法是,如果帐户有重复的行,则前一行的最大值将在最大日期列上。如果重复的行也有相同的日期,我需要取"最大代码"列,如果有重复日期的行,帐户的"代码"列也有,那么我会取"金额"列。账户的前一行最大优先级是日期、代码、金额。一个有前几行的账户的例子,我需要采取最大值:

       **Account**     **Date**    **Code**    **Amount** 
1.        123           31/05/20       6           200  
2.        123           31/05/20       6           200
3.        123           31/05/20       6           300
4.        124           31/05/20       7           100
5.        124           31/05/20       8            90

帐户123的预期结果是第3行,而帐户124的预期结果则是第5行。每个帐户的当前行30/06/20要么从#temp表中发出,要么根据不同的列条件包含。我的方法片段:

SELECT  account, max(Datecolumn) , max(Code) , max(Amount) --,  more columns...
FROM Mytable
WHERE Datecolumn  <   ( select  max(Datecolumn)  from #temp )
and Code          <   ( select  max(Code)        from #temp  )
and Amount        <   ( select  max(Amount)      from #temp )
-- different conditions for different columns....
GROUP BY  account  --, more columns...

您可以使用ROW_NUMBER()为每个帐户标识所需的行。例如:

select
from (
  select *,
    row_number() over(partition by account 
                      order by datecolumn desc, code desc, amount desc
                     ) as rn
  from MyTable
) x
where rn = 1

对于每个帐户,此查询按datecolumn desc, code desc, amount desc对行进行排序,并从1开始按顺序分配一个值。然后CCD_ 4子句移除具有不同于CCD_;最好的";行。

您可以使用窗口函数-row_number()

select * from
(
select *,row_number() over(partition by account order by id desc) as rn
from tablename
)A where rn=1

最新更新