数据最长日期后的第二天

时间:2017-05-02 14:39:56

标签: sql sql-server date

我正在将数据加载到表中。我没有关于源数据加载频率或时间的任何信息,我所知道的是我需要来自源的数据来运行我的脚本。

这是问题所在,如果我运行max(date),我会从源代码获取最新日期,但我不知道数据是否仍在加载。我遇到了一些案例,我只获得了一定比例的数据。因此,我需要在最长日期之后的下一个工作日。

我想知道有没有办法在系统中获得第二个最新日期。我知道我可以得到最大值(日期) - 1,但是这就是第二天给我的字面意思。我不需要字面上的日子。

例如,如果我在星期二运行脚本,则max(date)将是星期一,但由于周末不在源系统中,我需要到星期五而不是星期一。

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?

6 个答案:

答案 0 :(得分:1)

您可以使用row_number并获得第二个

PropertyChanged

答案 1 :(得分:1)

根据您的SQL Server版本,您可以使用窗口函数,如row_number

select [Date]
from
(
  select [Date],
    rn = row_number() over(order by [Date] desc)
  from #yourtable
) d
where rn = 2

这是demo

如果你有多个相同的日期,你可以先执行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;

答案 2 :(得分:0)

最近的SQL Server版本支持FETCH FIRST

select date
from tablename
order by date desc
offset 1 fetch first 1 row only

OFFSET 1表示跳过一行。 (2017-04-29排。)

答案 3 :(得分:0)

另一种方法,例如为了...

SELECT MIN(A.date)
FROM
(
SELECT  TOP 2 DISTINCT date
FROM    YourTable AS C
ORDER BY date DESC
) AS A

答案 4 :(得分:0)

您还可以将FIRST_VALUE与DATEADD(DD,-1,GETDATE())之类的动态日期一起使用。以下示例的日期为硬编码。

SELECT DISTINCT
    FIRST_VALUE([date]) OVER(ORDER BY [date] DESC) AS FirstDate
FROM CTE 
WHERE [date] < '2017-04-25'

答案 5 :(得分:0)

另一种方式

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')