0
让我们有以下数据相当于甲骨文NTH_VALUE功能
CREATE TABLE [dbo].[LogTable] ([DateSent] [datetime] NULL)
GO
CREATE CLUSTERED INDEX [IX_LogTable_DateSent] ON [dbo].[LogTable] ([DateSent] DESC)
GO
INSERT INTO [LogTable]
SELECT TOP 500000 NULL, DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
FROM sys.sysobjects
CROSS JOIN sys.all_columns
我想找到第二个和DateSent
每年的第三个最低值。 Oracle为此提供了NTH_VALUE
函数,但是,在SQL Server中没有这样的事情。我创建了以下查询
SELECT YEAR(datesent),
(
SELECT datesent
FROM
(
SELECT datesent, ROW_NUMBER() OVER (ORDER BY datesent) r
FROM logtable
WHERE YEAR(datesent) = YEAR(lt.datesent)
) logtable_ranked
WHERE logtable_ranked.r = 2
) second_lowest_in_year,
(
SELECT datesent
FROM
(
SELECT datesent, ROW_NUMBER() OVER (ORDER BY datesent) r
FROM logtable
WHERE YEAR(datesent) = YEAR(lt.datesent)
) logtable_ranked
WHERE logtable_ranked.r = 3
) thirt_lowest_in_year
FROM logtable lt
GROUP BY YEAR(datesent)
它返回正确的结果,但它在我的服务器上花费超过7s的CPU时间。此外,该解决方案的时间随着我需要的NTH个数值线性增长。是否有更好的(更快,也许更优雅)的方式来计算SQL Server中的NTH_VALUE?
非常好的一个。需要少于2s的CPU时间才能执行。 –