【问题标题】:Retrieve rows in SQL based on Maximum value in multiple columns根据多列中的最大值检索SQL中的行
【发布时间】:2018-05-29 15:34:06
【问题描述】:

我有一个包含以下字段的 SQL 表:

  • 公司编号
  • 公司名称
  • 财政年度
  • 财政季度

每家公司都有多个会计年度和会计季度的记录。我想根据最大会计年度和最大会计季度检索每家公司的行。例如,如果表有以下内容:

Company ID  |  Company Name  |  Fiscal Year | Fiscal Quarter 
1           |  Test1         |  2017        | 1
1           |  Test1         |  2017        | 2
1           |  Test1         |  2018        | 1
1           |  Test1         |  2018        | 2
2           |  Test2         |  2018        | 3
2           |  Test2         |  2018        | 4

查询应返回以下内容(仅具有该年度最大会计年度和最大会计季度的记录):

Company ID  |  Company Name  |  Fiscal Year | Fiscal Quarter 
1           |  Test1         |  2018        | 2
2           |  Test2         |  2018        | 4

我可以使用以下查询来获取最大会计年度的记录,但不确定如何进一步选择一年中的最大季度:

SELECT fp.companyId, fp.companyname, fp.fiscalyear,fp.fiscalquarter
FROM  dbo.ciqFinPeriod fp
  LEFT OUTER JOIN dbo.ciqFinPeriod fp2
    ON (fp.companyId = fp2.companyId AND fp.fiscalyear < fp2.fiscalyear)
WHERE fp2.companyId IS NULL

非常感谢您的帮助!

【问题讨论】:

  • 你有CompanyName这个表吗?至少可以说,这似乎是一个规范化问题。

标签: sql sql-server max multiple-columns


【解决方案1】:

如果您有公司列表,我会这样做:

select fp.*
from Companies c outer apply
     (select top (1) fp.*
      from dbo.ciqFinPeriod fp
      where fp.companyId = c.companyId
      order by fp.fiscalyear desc, fp.fiscalquarter desc
     ) fp;

如果不是,那么row_number()可能是最简单的方法:

select fp.*
from (select fp.*,
             row_number() over (partition by fp.companyId order by order by fp.fiscalyear desc, fp.fiscalquarter desc) as seqnum
      from dbo.ciqFinPeriod fp
     ) fp
where seqnum = 1;

或者更深奥(聪明?):

select top (1) with ties fp.*
from dbo.ciqFinPeriod fp
order by row_number() over (partition by fp.companyId order by order by fp.fiscalyear desc, fp.fiscalquarter desc)

【讨论】:

  • 我是 WITH TIES 版本的粉丝。深奥与聪明常常携手并进。
  • 非常感谢!第二个和第三个选项都很好用,而且效率也很高!
【解决方案2】:

我在以下方面取得了一些成功,与您的输出相同。

create table #table
(
CompanyID int,
CompanyName varchar(200),
Year int,
Quater int
)

insert into #table (CompanyID,CompanyName,Year,Quater)
VALUES

('1','Test1','2017','1'),
('1','Test1','2017','2'),
('1','Test1','2018','1'),
('1','Test1','2018','2'),
('2','Test2','2018','3'),
('2','Test2','2018','4')

SELECT CompanyID,CompanyName,Year,Quater  
FROM
(

Select CompanyID,CompanyName,Year,Quater
, ROW_NUMBER() OVER(PARTITION BY CompanyID ORDER BY Year desc,Quater DESC)         
as RowNum
from #table

) X  WHERE RowNum = 1

drop table #table

【讨论】:

    【解决方案3】:

    Select Company I'd, company name,Max(year),Max(quarter) group by 1,2

    【讨论】:

    • 这是你期待的吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2020-03-05
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多