sql—如何在重复行的情况下获取前一行的最大值以及每个最大列的优先级

pod7payv  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(351)

我有一个表,其中包含帐户行和有关帐户的详细信息。我创建了一个适合我的条件的临时表,并将其命名为#temp2。现在我需要做的是从原始表中获取max previous行,该行符合与当前行不同的其他条件,当前行已经被带到临时表中。我要处理的问题是,我需要以怎样的方式获取前一行的最大值。简单的方法是,如果帐户有重复的行,则max previous行将位于max date列。如果重复的行也有相同的日期,我需要取max code列,如果有重复日期的行和帐户的code列,那么我将取amount列。帐户的最大前一行的优先级为-日期、代码、金额。我需要取最大值的前几行帐户示例:


**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...
qcuzuvrc

qcuzuvrc1#

你可以用 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 . 然后 WHERE 子句将删除值不同于的所有其他行 1 仅为每个帐户保留“最佳”行。

exdqitrt

exdqitrt2#

你可以使用窗口功能- row_number() ```
select * from
(
select *,row_number() over(partition by account order by id desc) as rn
from tablename
)A where rn=1

相关问题