Sql 如何从日期中选择一个非空日期-如果日期为空,则选择下一个

Sql 如何从日期中选择一个非空日期-如果日期为空,则选择下一个,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要从一周中选择一个日期,必须是星期五。然而,当星期五为空时——这意味着没有输入任何数据,我必须找到同一周中有数据的任何其他日期。有人能分享他们对如何解决这种情况的看法吗 如果您在下面的数据中看到,在第二周,星期五有空条目,因此必须选择另一天 Day Weekdate Data entry dt Data 1 2/7/2016 2 2/8/2016 3 2/9/2016 4 2/10/2016 5 2/

我需要从一周中选择一个日期,必须是星期五。然而,当星期五为空时——这意味着没有输入任何数据,我必须找到同一周中有数据的任何其他日期。有人能分享他们对如何解决这种情况的看法吗

如果您在下面的数据中看到,在第二周,星期五有空条目,因此必须选择另一天

Day Weekdate    Data entry dt   Data
1   2/7/2016        
2   2/8/2016        
3   2/9/2016        
4   2/10/2016       
5   2/11/2016       
6   2/12/2016   2/12/2016   500
7   2/13/2016       
1   2/14/2016       
2   2/15/2016       
3   2/16/2016       
4   2/17/2016   2/17/2016   300
5   2/18/2016       
6   2/19/2016   NULL    NULL
7   2/20/2016       
1   2/21/2016       
2   2/22/2016       
3   2/23/2016       
4   2/24/2016       
5   2/25/2016       
6   2/26/2016   2/26/2016   250
7   2/27/2016
你可以试试这个

--Not null data
select * from tblData
  where DATEPART(dw,weekDate) = 6 and data is not null

Union

Select data.* from 
  (
    select weekDate 
      from tblData
      where DATEPART(dw,weekDate) = 6 and data is null
  ) nullData --Select Friday with null data
  Cross Apply 
  (
    --Find first record with not null data that is within this week
    Select top 1 * 
      From tblData data
      Where
        data.weekDate between Dateadd(day, -6, nullData.weekDate) and nullData.weekDate
        and data.data is not null
      Order by data.weekDate desc
  ) data

您可以尝试以下方法来获取表格中每周最新日期(先是星期五,然后是每隔一天)的输入数据:

SELECT
    Weeks.FirstofWeek,
    Detail.Day,
    Detail.DataEntryDt,
    Detail.Data
FROM
( --master list of weeks
    SELECT DISTINCT DATEADD(DAY,(1-DATEPART(dw,Weekdate)),Weekdate) AS FirstofWeek
    FROM dataTable
) AS Weeks
LEFT OUTER JOIN 
( --detail
    SELECT 
        --order first by presence of data, then by date, selecting Friday first:
        ROW_NUMBER() OVER (PARTITION BY DATEADD(DAY,(1-DATEPART(dw,Weekdate)),Weekdate) ORDER BY CASE WHEN Data IS NOT NULL THEN 99 ELSE 0 END DESC, CASE WHEN [Day] = 6 THEN 99 ELSE [Day] END DESC) AS RowNum,
        [Day],
        DATEADD(DAY,(1-DATEPART(dw,Weekdate)),Weekdate) AS FirstofWeek,
        Weekdate,
        DataEntryDt,
        Data
    FROM dataTable 
) AS Detail
    ON Weeks.FirstofWeek = Detail.FirstofWeek
    AND Detail.RowNum = 1 --get only top record for week with data present

样本数据的期望输出是什么?在给定的一周内,您希望的天数顺序是否有偏好?