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创建视图。