i正在将数据加载到表中。我没有任何有关加载源数据的频率或何时加载的信息,我所知道的是我需要来自源的数据才能运行脚本。
这是问题,如果我运行最大(日期(,我会从源获得最新日期,但是我不知道数据是否仍在加载。我遇到了我只有一定比例的数据的情况。因此,我需要最大约会之后的下一个工作日。
我想知道是否有一种方法可以在系统中获得第二个最新日期。我知道我可以得到最大(日期(-1,但这在第二天就给了我。我不需要以后的一天。
示例,如果我在星期二运行脚本,最大(日期(将是星期一,但是由于周末不在源系统中,我需要获得星期五而不是星期一。
DATE
---------
2017-04-29
2017-04-25
2017-04-21
2017-04-19
2017-04-18
2017-04-15
2017-04-10
max(date) = 2017-04-29
我如何获得2017-04-25?
根据您的SQL Server版本,您可以使用row_number
:
select [Date]
from
(
select [Date],
rn = row_number() over(order by [Date] desc)
from #yourtable
) d
where rn = 2
这是一个演示。
如果您有相同日期的多个,则可以先执行distinct
:
;with cte as
(
select distinct [date]
from #yourtable
)
select [date]
from
(
select [date],
rn = row_number() over(order by [date] desc)
from cte
) x
where rn = 2;
您可以使用row_number并获得第二名
select * from ( select *, Rown= row_number() over (order by date desc) from yourtable ) a
where a.RowN = 2
更多最新的SQL Server版本支持FETCH FIRST
:
select date
from tablename
order by date desc
offset 1 fetch first 1 row only
OFFSET 1
表示跳过一行。(2017-04-29行。(
;With cte([DATE])
AS
(
SELECT '2017-04-29' union all
SELECT '2017-04-25' union all
SELECT '2017-04-21' union all
SELECT '2017-04-19' union all
SELECT '2017-04-18' union all
SELECT '2017-04-15' union all
SELECT '2017-04-10'
)
SELECT [DATE] FROM
(
SELECT *,ROW_NUMBER()OVER(ORDER BY Seq)-1 As Rno FROM
(
SELECT *,MAX([DATE])OVER(ORDER BY (SELECT NULL))Seq FROM cte
)dt
)Final
WHERE Final.Rno=1
输出
DATE
-----
2017-04-25
您也可以将first_value与Dynamic Date一样使用DATEADD(dd,-1,getDate(((。下面的示例具有硬编码日期。
SELECT DISTINCT
FIRST_VALUE([date]) OVER(ORDER BY [date] DESC) AS FirstDate
FROM CTE
WHERE [date] < '2017-04-25'
另一种方式
DECLARE @T TABLE ([DATE] DATE)
INSERT INTO @T VALUES
('2017-04-29'),
('2017-04-25'),
('2017-04-21'),
('2017-04-19'),
('2017-04-18'),
('2017-04-15'),
('2017-04-10');
SELECT
MAX([DATE]) AS [DATE]
FROM @T
WHERE DATENAME(DW,[DATE]) NOT IN ('Saturday','Sunday')
另一种做法的方式,只是为了提示...
SELECT MIN(A.date)
FROM
(
SELECT TOP 2 DISTINCT date
FROM YourTable AS C
ORDER BY date DESC
) AS A