Извлекать строки в SQL на основе максимального значения в нескольких столбцах - PullRequest
0 голосов
/ 29 мая 2018

У меня есть таблица 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

Большое спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

У меня был некоторый успех с тем же выводом, что и у вас.

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
0 голосов
/ 29 мая 2018

Выберите название компании, название компании, Макс (год), Макс (квартал), группа 1,2

0 голосов
/ 29 мая 2018

Если у вас есть список компаний, я бы просто сделал:

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)
...