Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在单独的列中获取最大日期(月和年)_Sql_Sql Server - Fatal编程技术网

Sql 在单独的列中获取最大日期(月和年)

Sql 在单独的列中获取最大日期(月和年),sql,sql-server,Sql,Sql Server,我有这张桌子: 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

我有这张桌子:

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

一个选项是使用
行编号

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

这假定数字和提供程序字段相同。如果没有,您可能还需要按数字字段进行分区。

您可以使用行号和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

您的查询有问题吗?如果可能,我强烈建议将日期时间信息存储在单个日期时间列中。将其存储在两列中是非常具有挑战性的。当然,这并不总是可能的。好吧,假设我需要一个视图,我想使用它,我应该创建一个内联函数,我想,在这种情况下,性能仍然很好?你可以创建一个带有cte的视图。不需要内联函数。@carlosm添加了如何使用cte创建视图。