У меня есть такая таблица:

Month   Year    Provider    Number
1       2015    1           345
2       2015    1           345
3       2015    1           345
12      2015    2           444
1       2016    2           444

Скажем, я хочу получить все разные числа по поставщику, но только максимальный месяц и максимальный год, примерно так:

Month   Year    Provider    Number
3       2015    1           345
1       2016    2           444

У меня есть этот уродливый запрос, который я хотел бы улучшить:

SELECT (SELECT max([Month]) 
        FROM dbo.Info b
        WHERE b.Provider = a.Provider
          AND b.Number = a.Number
          AND [Year] = (SELECT max([Year]) 
                          FROM dbo.Info c
                         WHERE c.Provider = a.Provider
                           AND c.Number = a.Number)) AS [Month],
        (SELECT max([Year]) 
           FROM dbo.Info d
          WHERE d.Provider = a.Provider
            AND d.Number = a.Number)) AS [Year],
        a.Provider,
        a.Number
 FROM dbo.Info a
1
carlosm 19 Фев 2016 в 00:49

2 ответа

Лучший ответ

Вы можете использовать row_number и cte

;WITH cte AS (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY Provider ORDER BY [Year] DESC, [Month] DESC) as rNum
  FROM Info)

SELECT *
FROM cte where rNum = 1

Если вы хотите создать представление, тогда

CREATE VIEW SomeViewName
AS

WITH cte AS (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY Provider ORDER BY [Year] DESC, [Month] DESC) as rNum
  FROM Info)

SELECT *
FROM cte where rNum = 1
0
SQLChao 18 Фев 2016 в 22:34

Один из вариантов - использовать row_number:

select *
from (
    select *, row_number() over (partition by provider 
                                 order by [year] desc, [month] desc) rn
    from dbo.Info
) t
where rn = 1

Предполагается, что поля числа и поставщика совпадают. В противном случае вам может потребоваться также разделение по числовому полю.

1
sgeddes 18 Фев 2016 в 21:52